一.初始化列表
- 当类中的成员是对象时,会先调用成员的构造函数,然后再调用自身的构造函数,为了给对象成员赋值先赋值,就需要使用到初始化列表
class A{
private:
int a;
B ob;
public:
A(int d):ob(c)//初始化列表
{
a = b;
}
};
二.explicit关键字
用于修饰构造函数防止其进行隐式转换,只针对单参数和除了第一个参数没有默认值时的构造函数
class MyString{//这里的类相当于String
public:
explicit MyString(int n){
cout<<"MyString(int n)";
}
MyString(const char* str){
cout<<"MyString(const char* str)";
}
};
int main(){
//会产生歧义,是给字符串赋值还是初始化
//MyString str1 = 1;
MySting str1(10);
//表意明确,是给字符串赋值
MySting str3 = "abc";
return 0;
}
三.const修饰成员函数
const修饰成员函数时,不能修改本类中的任何一个成员变量,但用mutable修饰时可以改变变量值
class Data
{
public:
int a;
int b;
mutable int c;
public:
void showData() const{
//a = 100;//不能进行修改
c = 200;
cout<<a<<" "<<b<<" "<<c;
}
};
四.友元
- 友元函数可以访问类中的私有成员,可以将全局函数、类中成员函数和类声明为友元
- 使用friend关键词声明友元,只能出现在声明处
1.友元的使用
1.1 普通全局函数
#include <string>
using namespace std;
class Room
{
friend void visiting(Room &room);
private:
string bedRoom;
public:
string setingRoom;
public:
Room(string bedRoom,string setingRoom){
this->bedRoom = bedRoom;
this->setingRoom = setingRoom;
}
};
//普通的全局函数
void visiting(Room &room){
cout<<room.setingRoom<<endl;
cout<<room.bedRoom<<endl;
}
int main(){
Room room("卧室","客厅");
visiting(room);
return 0;
}
1.2 类的成员函数以及类
#include <string>
using namespace std;
class Room;//提取声明
class goodGay{
public:
void visiting01(Room &room);
void visiting02(Room &room);
}
class Room
{
friend void visiting01(Room &room);//friend class goodGay;//类的成员函数和类的声明为友元
private:
string bedRoom;
public:
string setingRoom;
public:
Room(string bedRoom,string setingRoom){
this->bedRoom = bedRoom;
this->setingRoom = setingRoom;
}
};
void goodGay::visiting01(Room &room){
cout<<room.setingRoom<<endl;
cout<<room.bedRoom<<endl;
}
void goodGay::visiting02(Room &room){
cout<<room.setingRoom<<endl;
//cout<<room.bedRoom<<endl;//当为类的成员函数时是无法访问的,但当其为类友元是可以访问
}
int main(){
Room room("卧室","客厅");
goodGay ob;
ob.visiting01(room);
ob,visiting02(room);
return 0;
}
2.友元的注意事项
- 友元关系不能被继承
- 友元关系是单向的,即类A是类B的朋友,但类B不一定是类A的朋友
- 友元关系不具有传递性