C/C++ 中const && static && this指针

文章目录

const

作用:

  1. 修饰变量,变量不可改变:const int var1即常量,更推荐使用const而不是以#define定义常量,因为const可以指定常量类型,而define仅仅是符号替换。
  2. 修饰指针,分为两种情况:
    (1) const*前,const int * p1int const * p2两者等价,都是说不能通过* p来修改所指向的变量的值。
    (2) const*后,int * const p, p一经指定,就不能指向其他变量。这个和C++的引用&非常像。都需要初始化指定,并且一旦指定就不能修改(但是赋值的方式完全不同)。
	int a = 0;
	int b;
	int* const p = &a;
	int &c = b;
  1. 修饰函数
    (1)修饰普通函数
    如:const int fun(){},代表返回一个常量。需要用一个常量接收
    同理:const int * fun(){} 需使用const int *指针接收
    int const * fun(){} 需使用int const *指针接收
    (2)在类中修饰成员函数
    这个有点特殊,用于类的成员函数。代表这是一个常成员函数,不得修改类中的任何数据成员的值。造成这一特性的根本原因是:this指针
    this 指针是一个隐含于每一个非静态成员函数中的特殊指针。在类中,this 指针被隐含地声明为: ClassName *const this,这意味着不能给 this`指针赋值;而在 ClassName类的 const成员函数中(如下示例:int getValue() const;),this 指针的类型为:const ClassName* const,这说明不能对this指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);
class A
{
    
    
private:
	const int a = 20;        // 常对象成员,只能在初始化列表赋值
public:
	// 构造函数
	A() : a(0) {
    
     };	
	A(int x) : a(x) {
    
    };		 // 初始化列表
	int getValue() const;    // 常成员函数,不得修改类中的任何数据成员的值
}
  1. 修饰引用
    (1)指向常量的引用(reference to const)
    这个一般用于函数传参,引用参数在函数内为常量
    void function4(const int& Var);
    (2) 没有 const reference,因为引用本身就是 const pointer
    这个就是类似int * const p。这是C++引用的特性。引用被创建时候必须初始化,指定一个同类型的变量(或函数等)。二者可以被视为等价,即可使用引用操作原变量。

static

作用

  1. 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。
  2. 修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用。在多人开发项目时,为了防止与他人命名空间里的函数重名,可以将函数定位为 static。
  3. 修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。
  4. 修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。
class A
{
    
    
private:
	const int a = 20;                // 常对象成员,只能在初始化列表赋值
	static int n;
public:
	int c = 20;
	// 构造函数
	A() : a(0) {
    
     };
	static int getN();
};
int A::getN()
{
    
    
	n++;
	// c ++;   错误,不能操作非静态成员
	// return a;  
	// return c;
	return n;
}

this指针

  1. this 指针是一个隐含于每一个非静态成员函数中的特殊指针。它指向调用该成员函数的那个对象。
  2. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用 this 指针。
  3. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。
  4. this 指针被隐含地声明为: ClassName *const this,这意味着不能给 this 指针赋值;在 ClassName 类的 const 成员函数中,this 指针的类型为:const ClassName* const,这说明不能对 this 指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);
  5. this 并不是一个常规变量,而是个右值,所以不能取得 this 的地址(不能 &this)。
    在以下场景中,经常需要显式引用 this 指针:
    (a)为实现对象的链式引用;
    (b)为避免对同一对象进行赋值操作;
    (c)在实现一些数据结构时,如 list。

猜你喜欢

转载自blog.csdn.net/changyi9995/article/details/108236278
今日推荐