目录
再谈构造函数
构造函数体赋值
![](https://img-blog.csdnimg.cn/f25e415926a64765a648e8900f924467.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARW50aHVzaWFzdGljX2JveQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
初始化列表
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括 号中的初始值或表达式。
![](https://img-blog.csdnimg.cn/1b0ebb4e007c499d9add67f56fe1e5ed.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARW50aHVzaWFzdGljX2JveQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
注意以下几点:
![](https://img-blog.csdnimg.cn/89ad7241b0834c98a3eca8d3d8303bd1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARW50aHVzaWFzdGljX2JveQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
那么对于没有默认构造函数的自定义类型成员又是怎么一回事?
为什么编译会报错呢?因为在Date类中,如果自己没有写初始化列表,编译器就会自动生成,对于基本类型,会初始化为随机值,但是对于自定义类型对象_a,编译器会这样处理:_a();这就相当于调用了A类中默认构造函数,但是此时A类中并没有默认构造函数,就会报错。解决方案:在A类中给出默认构造函数或者在Date类初始化列表中手动对_a进行初始化。
explicit关键字
#include <iostream>
using std::cout;
class Date{
public:
Date(int year)
:_year(year)
,_month(3)
,_day(25)
{
cout << "Date(int year)" <<this<< '\n';
}
~Date(){
cout << "~Date()" <<this<< '\n';
}
private:
int _year;
int _month;
int _day;
};
int main(){
Date d(2022);
//2023是int类型的,不能直接给Date类型的对象d进行直接赋值
//编译器在编译的时候,发现Date有一个单参的构造函数
//于是编译器借助单参的构造函数生成一个临时的对象,再用这个临时对象给d赋值
d = 2023;
return 0;
}
运行结果如下:
根据打印结果,首先调用了构造函数对d进行初始化,然后生成了临时变量给d赋值,在对这个临时变量进行析构。
static成员
静态成员变量
特性:
1.静态成员变量为所有类对象所共享,不属于某个具体的实例,不影响sizeof(对象)的大小
2. 静态成员变量必须在类外定义,定义时不添加static关键字
3.静态成员变量即可用类名::静态成员或者对象.静态成员来访问
4.静态成员变量不能放在构造函数初始化列表的位置进行初始化
5.静态成员变量访问受到访问限定符的限定
#include <iostream>
using std::cout;
class Date{
public:
Date(int year,int month,int day){
_year = year;
_month = month;
_day = day;
count++;
}
Date(Date& d){
_year = d._year;
_month = d._month;
_day = d._day;
count++;
}
~Date(){
count--;
}
int GetCount(){
return count;
}
private:
int _year;
int _month;
int _day;
static int count;//只是声明
};
int Date::count = 0;//定义
int main(){
Date d1(2022,3,25);
Date d2 = d1;//注意:此处调用的也是拷贝构造
Date d3(d2);
cout << d3.GetCount()<< '\n';
return 0;
}
![](https://img-blog.csdnimg.cn/8d7a1af074f54ecaa7d6589ae5157de4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARW50aHVzaWFzdGljX2JveQ==,size_9,color_FFFFFF,t_70,g_se,x_16)
打印出来了3,说明创建了三个对象,与实际情况符合。
静态成员函数
特性:
1.静态成员函数中没有隐藏的this指针
2.静态成员函数即可用类名::静态成员或者对象.静态成员来访问
3.静态成员函数中不能访问普通成员变量和普通成员方法,只能访问静态成员
友元
友元函数
特性:
1.友元函数可访问类的私有和保护成员,但不是类的成员函数
2.友元函数不能用const修饰
3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制
友元类
#include <iostream>
using namespace std;
class A{
public:
friend class Date;//声明Date类为A类的友元类
A(int a){
_a = a;
}
private:
int _a;
};
class Date{
public:
Date(int year, int month, int day)
:Aa(10)
{
_year = year;
_month = month;
_day = day;
}
void Print(){
cout << _year <<' '<< _month <<' '<< _day<<' ' << Aa._a;//可以访问Aa类的私有成
}
private:
int _year;
int _month;
int _day;
A Aa;
};
int main(){
Date d1(2022,3,25);
d1.Print();
return 0;
}
特性: