当前位置: 首页 > news >正文

C++基础学习记录—this指针和const关键字

1、概念

1、this指针是一个特殊的指针,存储的对象的首地址,成员函数(类内)都隐含一个this指针。

2、类的成员函数(包括构造函数和析构函数)中都有this指针,因此this指针只能在类内部使用。

3、哪个对象调用成员函数,this指针就指向哪个对象,访问哪个对象的属性。虽然不用手写this指针,但是编译器都会使用this指针来调用成员。

#include<iostream>using namespace std;class Test{
private:string name;
public://this可以用来区分同名参数和成员属性Test(string name){this->name = name;}void test_this(){cout << this << endl;}void show(){//只有对象才能调用成员,非重名情况编译器自动添加thiscout << name << endl;cout << this->name << endl;this->test_this();}
};int main(){Test t1("admin");t1.show();return 0;
}

2、应用

1、区分同名参数和成员属性

        可以用this指针来区分同名参数和成员属性

2、类中成员的调用都是依赖于this指针的

        类中成员的调用都是依赖于this指针的,默认情况下由编译器自动添加

3、链式调用

        当返回值是对象引用时,可以返回*this,此函数支持链式调用。

支持链式调用的成员函数的特点:

1、返回值类型是当前类的引用

2、return后面是 *this

#include <iostream>using namespace std;class Test{
private:int num;
public:Test(int num)//1、可以用this指针来区分同名参数和成员属性{this->num=num;}//num 读接口int get_num(){//2、类中成员的调用都是依赖于this指针的,默认情况下由编译器自动添加return  this->num;//就是return num}//num进行add操作  3、链式调用//当返回值类型时对象引用时,可以返回*this,此函数支持链式调用Test& add(int n){num += n;return *this;}
};int main()
{Test t1(2);cout << t1.get_num() <<endl;//2
//    t1.add(3);
//    cout << t1.get_num() <<endl;
//    t1.add(4);
//    cout << t1.get_num() <<endl;
//    t1.add(100);
//    cout << t1.get_num() <<endl;//链式调用  可以对上述代码进行简写cout << t1.add(3).add(4).add(100).get_num() << endl;return 0;
}

附加面试题:new的过程(创建对象的过程):

  1. 内存分配
  • new运算符首先调用底层的内存分配函数(通常是operator new),为对象分配足够的内存空间。
  • 如果内存分配失败(例如,由于内存不足),operator new会抛出一个std::bad_alloc异常。
  1. 构造函数调用
  • 一旦内存分配成功,new运算符会在分配的内存上调用对象的构造函数来初始化对象属性。
  • 这意味着对象的成员变量会被初始化,并且任何在构造函数中编写的初始化代码都会被执行。
  1. 返回指针
  • 最后,将初始化过的对象的首地址赋值给this, 并将this返回。

const关键字

const关键字通常表示只读,不可修改,可以保证数据的安全性。

1、const修饰局部变量

const修饰的局部变量,叫做常局部变量 表示该局部变量不可被修改。

2、const修饰成员变量

const修饰的成员变量,叫常成员变量,表示该成员变量的值无法被修改。

常成员变量有两种初始化方式:

1、直接初始化 声明后直接赋值。

2、构造初始化列表,必须通过构造初始化列表赋予初值,不能通过构造函数方法赋初值。

以上两种方法同时使用时,前者失效,以后者为准,推荐使用后者赋值。

#include<iostream>using namespace std;class Test{
private://常成员变量const int a;const int b=1;//可以直接初始化赋值int c;
public:// 错误  普通构造函数无法给常成员变量初始化// Test(int val){//a=val;//    }//只能通过构造函数初始化列表赋值Test(int val):a(val),b(10){ }void show(){//a++;//错误  常成员变量是只读的,不可以修改cout << a << endl;cout << b << endl;}
};int main(){Test t1(2);t1.show();return 0;
}

3、const修饰成员函数

定义:const修饰的成员函数,叫常成员函数。

特性:

1、常成员函数,可以访问任何成员变量,但是不可以修改成员变量的值。

2、常成员函数,只能调用常成员函数,不能调用非const修饰的成员函数。

3、建议,只要成员函数不修改成员变量的值,就使用const修饰,例如getter等函数

4、const修饰对象

定义:const修饰的对象,叫做常对象。

书写格式:

1、const 类名 对象名

2、类名 const 对象名

特点:

常对象不允许修改属性值,只能调用const函数

 

#include<iostream>using namespace std;class Animate{
private:int weight;
public:int length=123;Animate(int weight):weight(weight){}void func(){cout << "普通的成员函数" << endl;}int get_weight() const{return weight;}void test() const{//weight++;//错误  常成员函数不能修改成员变量的值cout << weight << endl;cout << length << endl;//func();//错误 常成员函数不能调用非const函数cout << get_weight() << endl;}
};int main(){//常对象Animate const a1(55);//a1.length=135;//错误  常对象不能修改属性的值//a1.func();//错误 常对象只能调用const函数a1.test();cout << a1.get_weight() << endl;const Animate a2(66);cout <<a2.get_weight() << endl;cout << a2.length << endl;return 0;
}


http://www.mrgr.cn/news/90525.html

相关文章:

  • mysql8.0使用MGR实现高可用
  • Linux内核 - 非仿生机器人之感知主控系统(协议栈)
  • android studio下载安装汉化-Flutter安装
  • 并发编程---多线程不安全示例以及解决,多线程创建方式
  • 【嵌入式Linux应用开发基础】read函数与write函数
  • 【工业安全】-CVE-2019-17621-D-Link Dir-859L 路由器远程代码执行漏洞
  • 自然语言处理NLP入门 -- 第三节词袋模型与 TF-IDF
  • haproxy+nginx负载均衡实验
  • 解锁大语言模型潜能:KITE 提示词框架全解析
  • DeepSeek-V3 技术报告
  • 设计模式全解(含代码实例)
  • 【科技革命】颠覆性力量与社会伦理的再平衡
  • web前端布局--使用element中的Container布局容器
  • C++基础学习记录—this指针
  • c#中“事件-event”的经典示例与理解
  • c++ 多线程知识汇总
  • 开发一个类似小红书的社交电商平台需要综合技术、产品和运营能力
  • 自然语言处理NLP入门 -- 第一节基础概念
  • 黑马Mistral Le chat逆转deepseek
  • 【NLP 21、实践 ③ 全切分函数切分句子】