5.构造函数初始化列表、this指针
构造函数初始化列表:是对构造函数的一种增强,它能够初始化一些特殊的成员。如:常量,引用...
格式:
构造函数(参数列表):成员变量名{初始值},成员变量名2{初始值2},...
{
构造函数的函数体
}
必须使用构造函数初始化列表的场合:
1.成员变量是常量 const int a;
2.成员变量是引用(在定义的时候必须初始化)
3.成员对象没有无参构造函数
4.初始化基类成员
建议:成员变量的初始化都尽量使用构造函数初始化列表
1.代码简洁
2.初始化列表这种方式的效率比普通的构造函数高
3.构造函数的声明和定义分开的时候,构造函数初始化列表应该写在定义的地方
class Test
{
private:
const int a;
public:
//构造函数声明
Test();
Test(int a);
};
Test::Test():a{100}
{
cout << "Test::Test()" << endl;
}
Test::Test(int a):a{a}
{
cout << "Test(int a):a{a}" << endl;
}
int main()
{
Test t1;
Test t2{101};
}
5.1 this指针:
this指针:是一个对象指针,所有的成员函数(除去静态成员函数)都有一个this指针
1.this指针不需要用户显示赋值内部隐式赋值
2.this指针的作用域是在类的成员函数内部
构造函数中的this表示正在创建的对象的地址
析构函数中的this表示正在销毁的对象的地址
this使用代码示例eg:
#include <iostream>
#include <cstring>
using namespace std;
class Date
{
private:
int year;
int month;
int day;
public:
Date()
{
cout << "Date()" << endl;
year = 2001;
month = 9;
day = 8;
}
Date(int year,int month,int day)
{
cout << "Date()" << endl;
this->year = year;
this->month = month;
this->day = day;
}
~Date()
{
cout << "exti ~Date" << endl;
}
void print()const;
};
void Date::print()const
{
cout << year << "/" << month << "/" << day << endl;
}
class Student
{
private:
int age;
char name[32];
int num;
Date d;
const int a;
public:
Student():d{1,2,3},a{100}
{
cout << "Student()" << endl;
age = 18;
strcpy(name, "1234");
num = 2022;
}
Student(int age, char* name, int num):a{100}
{
this->age = age;
strcpy(this->name, name);
this->num = num;
}
~Student()
{
cout << "exti ~Student" << endl;
}
void Print()const;
};
void Student::Print()const
{
cout << age << ":" << name << ":" << num << endl;
d.print();
cout << "a = " << a << endl;
}
int main()
{
// Student s;
// s.Print();
Student s3;
s3.Print();
// Student s1{111,"222",333};
// s1.Print();
}
问题:
1.一个对象的this指针会影响对象的大小吗?
this指针不是对象的成员,所以不影响sizeof的结果.
2.如何定义一个Test对象数组,而对象的大小为0?
Test t[10];
Test* p_t = nullptr;// NULL
//p_t = malloc(sizeof(Test)*10);