我是靠谱客的博主 勤奋大叔,最近开发中收集的这篇文章主要介绍C/C++ 中const && static && this指针conststaticthis指针,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
文章目录
- const
- static
- this指针
const
作用:
- 修饰变量,变量不可改变:const int var1即常量,更推荐使用const而不是以#define定义常量,因为const可以指定常量类型,而define仅仅是符号替换。
- 修饰指针,分为两种情况:
(1)const
在*
前,const int * p1
,int const * p2
两者等价,都是说不能通过* p
来修改所指向的变量的值。
(2)const
在*
后,int * const p
, p一经指定,就不能指向其他变量。这个和C++的引用&
非常像。都需要初始化指定,并且一旦指定就不能修改(但是赋值的方式完全不同)。
int a = 0;
int b;
int* const p = &a;
int &c = b;
- 修饰函数
(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)指向常量的引用(reference to const)
这个一般用于函数传参,引用参数在函数内为常量
void function4(const int& Var);
(2) 没有 const reference,因为引用本身就是 const pointer
这个就是类似int * const p。这是C++引用的特性。引用被创建时候必须初始化,指定一个同类型的变量(或函数等)。二者可以被视为等价,即可使用引用操作原变量。
static
作用
- 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。
- 修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用。在多人开发项目时,为了防止与他人命名空间里的函数重名,可以将函数定位为 static。
- 修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。
- 修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 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指针
- this 指针是一个隐含于每一个非静态成员函数中的特殊指针。它指向调用该成员函数的那个对象。
- 当对一个对象调用成员函数时,编译程序先将对象的地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用 this 指针。
- 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。
- this 指针被隐含地声明为:
ClassName *const this
,这意味着不能给 this 指针赋值;在 ClassName 类的 const 成员函数中,this 指针的类型为:const ClassName* const
,这说明不能对 this 指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作); - this 并不是一个常规变量,而是个右值,所以不能取得 this 的地址(不能 &this)。
在以下场景中,经常需要显式引用 this 指针:
(a)为实现对象的链式引用;
(b)为避免对同一对象进行赋值操作;
(c)在实现一些数据结构时,如 list。
最后
以上就是勤奋大叔为你收集整理的C/C++ 中const && static && this指针conststaticthis指针的全部内容,希望文章能够帮你解决C/C++ 中const && static && this指针conststaticthis指针所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复