1、C++特性
- 封装:隐藏实现细节,代码模块化
- 继承:派生类可以继承父类的数据和方法,并扩展已存在的模块
- 多态:派生类重写父类的虚函数,实现接口的重用
- 动态内存管理上,C++多了new/delete
- C++中有了引用
- C++支持函数重载
- C++更加严格和安全,如const的正确性,指针和枚举的自动转换
2、virtual继承可以解决菱形继承带来的二义性
3、拷贝构造和赋值运算符重载
- 拷贝构造函数生成新的类对象,赋值运算符不行
- 拷贝构造生成新的类对象不用考虑源对象和新建对象是否相同,赋值运算符需要考虑这个,且需要把原来对象分配的内存释放掉
4、explicit显示构造
- 常见的用explicit修改的单参构造函数对应的类有vector、shared_ptr
5、C++常见关键字的使用
5.1 派生访问说明符
class teacher : public person {
/*...*/
};
5.2 explicit 显示调用
class Sales_data {
public:
Sales_data() = default;
//explicit只能修饰单参构造函数
explicit Sales_data(std::stream&);
};
//error 只能在类内声明构造函数时添加explicit关键字
explicit Sales_data::Sales_data(std::stream& is) {
read(is, *this);
}
5.3 final
//不希望某个类被继续继承或者某个虚函数被继续重写
//1.修饰类
class Base {
/*...*/
};
class A : public Base {
/*...*/
};
//指明B不能被继续继承
class B final : public Base {
/*...*/
};
//2.修饰虚函数
class Base {
public:
virtual void foo() = 0;
};
class A : public Base {
public:
void foo() final;
}
5.4 const
//1.修饰变量 以*为准,左定值,右定向,const修饰不变量
int a = 8;
const int * const p = &a;
//2.修饰函数 防止成员函数修改被调用对象的值
class Base {
public:
int getdata() const {
return data;
}
private:
data;
}
5.5 static
//修饰类中的变量或方法,表明为类变量/类方法 只需要类内声明 类外定义不需要添加
class Base {
public:
static void foo();
static int cnt;
};
void Base::foo() {
/*...*/
}
int Base::cnt = 0;
5.6 inline
//inline是一种用于实现的关键字,函数声明和定义分开时,inline要和定义放在一起
class Base {
public:
void foo(int x, int y);
};
inline void Base::foo(int x, int y) {
/*...*/
}
6、构造函数和析构函数中可以调用虚函数吗
- 首先两个函数中可以调用虚函数,编译器不会报错
- 由于类的构造是由基类到派生类,因此在基类的构造函数调用虚函数不会呈现多态
- 类的析构是由派生类到基类,基类析构时派生类已经完成析构了,因此基类的析构函数中调用虚函数不会呈现多态
- 另外基类的构造、析构中调用纯虚函数会报错
7、左值与右值
- 占确定内存空间的对象为左值
- C++规定非const左值引用不能被赋右值
- 常量左值引用可以赋右值,因为const修饰的引用不能修改
- std::move可以将一个左值引用转换为右值引用