文章目录
前言
一、类中特殊属性的初始化操作
二、类中静态属性的初始化操作
2.1 类中静态属性的作用
三、this指针
3.1 this指针的介绍
总结
随着我们按照顺讯学习,会发现在博主之前的学习笔记中留存了几个问题,不知道有没有朋友发现。好了,不卖关子了,有没有小伙伴想过这样一个问题,如果我在类中存在一个const修饰的属性,并且没有进行初始化,那么它在后续的程序中怎么使用?怎么初始化呢?我们带着这样的一个问题进行本篇笔记的整理学习。
为了解决引言中所提出的问题,C++提供了一个特殊的语法形式,即初始化列表,它的形式如下所示。
class 类名
{
const int id;
public:
类名():id(0) //在构造函数的形参列表的后面写初始化列表
{
//构造函数
}
};
需要注意的是,在类开辟存储空间的时候,初始化列表就会被调用,此时C++的边意思就会按照顺序将类中的属性进行初始化,需要注意的初始化列表起作用的时间是在构造函数之前。还是以学生类进行举例说明。
//定义类函数
class Stu
{
private:
string stu_name;
int stu_score;
const int stu_id; //只读属性,初始化一定要采用初始化列表的形式
public:
Stu(): stu_id(0) //这是没有参数的构造函数
{
memset(this, 0, sizeof(Stu));
cout << "这是没有参数的构造函数" << endl;
}
Stu(string name, int score, int id):stu_name(name),stu_score(score),stu_id(id)
{
cout << “这是有参数的构造函数” << endl;
}
void showInfo()
{
cout << “姓名:” << stu_name << ",成绩:" << stu_score << “,学号:” << stu_id << endl;
}
};
//在主函数中
Stu stu("xiaobai", 100 ,2023);
stu.showInfo();
Stu* p = new Stu("saodiseng", 100,2024);
p->showInfo();
注意在使用初始化列表的时候,建议按照类中属性声明的顺序一次初始化。
除次之外还需要注意每个成员变量在初始化列表中只能初始化一次,当类中自定义类兑现没有默认构造函数的时候可以采用初始化列表进行指定调用构造函数进行初始化,当类中有比较大的结构体对象时也可以采用初始化列表初始化。
当类中定义的属性有着static修饰的时,要注意在类外全局区域完成初始化的操作。举个例子
//还是采用学生的类
class Stu
{
private:
string name;
int score;
static int count;
public:
Stu(string name, int score)
{
count++;
}
void showInfo()
{
count << “学生人数:” << count <
}
};
//类外全局区域完成对类中静态属性初始化
int Stu::count = 0;
//主函数
Stu stu("xiaobai",100);
stu.showInfo; //此时需要依赖对象进行调用才能得知count的值
//如果将构造函数中的count定义成公有权限,就可以直接调用
static修饰的成员变量必须在类外进行初始化,static修饰的成员变量不依赖与某个对象,可以直接使用类名+域名访问符的形式,直接访问,static修饰的成员变量不占有类对象的空间。
早在C++学习笔记(五)中,博主就已经使用过this指针,当时并没有介绍指针,在此处博主将介绍下this指针的相关知识。
其实this指针是由C语言中来的,举个例子
//在C语言中构建结构体
struct Stu
{
char* name;
int score;
void (*pfunc)();
};
//this 就是结构体定义对象stu的常地址
void showInfo(struct Stu* const this)
{
printf(“姓名:%s,成绩:%d \n”,this->name,this->score);
}
int main()
{
struct Stu stu = {"xiaobai",100,showInfo};
stu.pfunc(&stu);
return 0;
}
在C++中只是将结构体换成类了,将函数的形式参数隐藏,并且将函数showInfo挪到了类中形成了行为属性。所以C++中也存在着隐藏的this指针。
在C++中使用this指针有着两个作用。第一个是,当成员函数的形式参数变量名和类中属性变量名同名的时候,用于区分两个变量名。第二个是,通过*this返回本对象
第一个作用在C++学习笔记(五)-CSDN博客中已经举了一个例子了,第二种作用的例子如下所示。
Stu& Setname(string name)
{
this->name = name;
return *this;
}
//主函数中写如下形式
stu.Setname("xiaobai");
stu.showInfo();
以上就是本篇学习笔记的内容,本篇笔记简单的介绍了this指针、特殊类型属性的初始化以及静态属性初始化。
如果有着不对的地方或者有不懂的地方,欢迎私信或者在评论区中与我交流,希望所整理的笔记对大家有所帮助。