移动构造
移动构造就是将一个对象中的指针变量赋值给新的对象,然后旧的对象放弃指针的指向
class Student{
public :
int *age;
Student():age(new int(18)){
cout << "执行构造函数~!~"<<endl;
}
//深拷贝
Student(const Student &s):age(new int(*s.age)){
cout << "执行拷贝构造函数~!~"<<endl;
}
//移动构造
Student( Student &&s):age(s.age){
cout << "执行移动!!!构造函数~!~"<<endl;
//移动之后,一般即可让原有对象的指针变成空指针
s.age = nullptr;
}
};
移动构造接收的是右值, 所以,要用move 函数 将对象转为右值再进行构造
this
在类中的this 和 python 中的self 很像,python 中的self 是 当前对象自己, 而c++中的this 就是 当前实例对象的指针
常函数
常函数就是了中不能修改属性的方法, 用const进行声明
class Student{
public:
string name = "无名氏";
int age = 18;
public :
//在此添加 const 即可变成常函数,
void printStudent() const{
// age = 10 ; 错误,不允许修改
cout << name << " " << age << endl;
}
};
要想对属性进行修改也是可以的,不过要将属性用 mutable 进行装饰
class Student{
public:
mutable string name = "无名氏";
mutable int age = 18;
public :
//在此添加 const 即可变成常函数,
void printStudent() const{
// age = 10 ; 错误,不允许修改
cout << name << " " << age << endl;
}
};
在属性前加上mutable ,这样常函数也可以对属性进行修改了
常对象
常对象也想常函数一样, 不能对属性进行修改,除非该属性有mutable 装饰
- 无法修改常对象中的成员(变量)
- 除非某个成员使用
mutable
修饰 - 常函数函不能访问普通的成员函数,但是可以访问常函数
- 普通的对象可以访问成原函数,也可以访问常函数
静态成员
静态成员相当于python中的类方法, 只会初始一份,各个实例对象共享,在c++中的静态成员不能在类内部初始化,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化
静态函数
静态函数是和类关联的函数, 静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数,因为没有实例对象也可以使用类进行调用静态函数,所以,静态函数不能调用实例方法,因为它不能找到实例空间,不过实例方法可以调用静态方法,因为它是和类一起的,可以找到方法空间
- 静态成员属于类,不属于对象
- 静态成员变量必须在类中声明,在类的外部初始化
- 静态成员变量的声明周期是整个程序,作用域在类的内部
- 静态成员函数只能访问静态成员变量
- 静态成员可以使用类来访问,也可以使用对象来访问。
友元函数
在一个类中如果它的属性或方法是私有的话,那么外部是不能进行调用的,那怎么样才能在外部函数也可以结束使用类的私有属性或方法呢, 可以在类中声明友元函数, friend 表名这个函数是可以调用类的属性或方法的,
class Car{
private:
string color {"红色"};
friend void showColor(Car c);
};
//实现友元函数,函数内部可以直接访问私有成员
void showColor(Car c) {
cout << c.color << endl;
}
通过 friend 声明外部函数,然后在外部函数中就可以调用类中的属性或方法了
友元类
在一个类中想要访问调用另一个类中的属性或方法 可以在要调用的类中声明友元类, 表名 这个类可以使用我 的私有属性或方法,
class Car{
private:
string color {"红色"};
friend class SSSS; //声明 4S 为友元类
public:
string getColor(){
return color;
}
};
class SSSS{
public:
void modifyCar( Car &myCar){ //改装汽车
myCar.color = "黑色";
}
};