这里写目录标题
一、构造函数(进阶)
在类实例化对象时,编译器会自动调用该类的构造函数,给对象中的各成员变量一个初始值。
1.1赋初值
class Time{
public:
Time(int hour,int minute,int second)
{
_hour = hour;
_minute = minute;
_second = second;
}
private:
int _hour;
int _minute;
int _second;
};
该构造函数体内只是给各个成员变量赋初值,并不是成员变量的初始化,因为初始化只能有一次,但是赋值该构造函数体内可以多次赋值。
1.2初始化列表
1.2.1初始化列表在哪里
接着我们需要谈谈,成员变量到底在哪里初始化。如下:
class Time{
public:
Time()
//成员变量初始化的位置
{
}
private:
int _hour;
int _minute;
int _second;
};
1.2.2初始化列表的格式
初始化列表:以冒号开始,接着使用逗号分隔各个成员变量,每个成员变量后面的括号中放入初始值。
1.2.3注意事项
1.每个成员变量在初始化列表只能出现一次
2.类中包含自定义/引用/const类型成员变量都必须在初始化列表进行初始化
Time a; //自定义类型变量
int &_minute; //引用变量
const int _second; //const变量
3.成员变量在类中声明的次序就是其初始化的顺序,与在初始化列表中的初始化顺序无关
在初始化_hour时,_minute并没有初始化,所以还是随机值。也就是在_hour初始化阶段将一个随机值赋值给了_hour。
1.3explicit关键字
对于单个参数的构造函数,具有类型转换的能力
为了去禁止这种隐式类型转换,这里就有了explicit关键字的应用
Time(int hour)
:_hour(hour)
{}
explicit Time(int hour)
:_hour(hour)
{}
这样就可以禁止Time类对象的单参隐式转换了,这里需要注意的时explicit关键字只能禁止单参构造函数的隐式转换(构造函数的参数大于等于2时,也不会出现隐式转换)
二、类的静态成员函数
2.1static成员
类的静态成员:static修饰的类成员
类的静态函数:static修饰的类的成员函数
类的静态成员变量:static修饰的类的成员变量(需要在类外进行初始化)
class People{
public:
static void fun() //静态成员函数
{
cout << _age << endl;
}
private:
static int _age; //静态成员变量
};
int People::_age = 0; //在类外初始化静态成员变量
特性:
1.类的静态成员,被该类所有对象共享。
2.静态成员函数没有this指针
3.类静态成员的访问方式:类名::静态成员或者对象.静态成员(注意访问限定符)
4.非静态成员函数可以调用静态成员函数
5.静态成员函数不能调用非静态成员函数。
2.2成员变量缺省值
C++11支持在类非静态成员变量的声明阶段进行赋值,这里其实是给声明的成员变量缺省值
class People{
public:
private:
static int _age; //静态成员变量
string _name = "coutinho"; //给缺省值
};
int People::_age = 0; //只能在类外初始化静态成员变量
三、友元与内部类
3.1友元函数
友元函数可以直接访问类的私有成员,它是定义在类外的普通函数,但是要在类内声明,声明是需要用到关键字friend。
重载C++标准输入输出:
class People{
friend ostream& operator<<(ostream& _cout, const People& data);
friend istream& operator>>(istream& _cin, People& data);
private:
int _age;
string _name;
};
ostream& operator<<(ostream& _cout, const People& data){
_cout << data._age << "-" << data._name;
return _cout;
}
istream& operator>>(istream& _cin, People& data){
_cin >> data._age;
_cin >> data._name;
return _cin;
}
注意:
1.友元函数可以访问类的所有成员,但是自己不是类的成员函数
2.友元函数可以在类内任意位置声明,不受访问限定符限制
3.一个函数可以实多个类的友元函数
3.2友元类
1.友元关系是单向的,不具有交换性
2.友元关系不能传递
3.3内部类
顾名思义,就是在一个类中去定义另一个类。
注意:
1.内部类就是外部类的友元(内部类中可以直接访问外部类的私有成员)
2.内部类是一个独立的类,不能通过外部类对象去调用内部类
3.内部类可以定义在外部类的任意访问限定符之间。
4.外部类的大小与内部类的大小无关