目录
public修饰的成员变量
在程序的任何地方都可以被访问,就是公共变量的意思,不需要通过成员函数就可以由类的实例直接访问
private修饰的成员变量
只有类内可直接访问,私有的,类的实例要通过成员函数才可以访问,这个可以起到信息隐藏
protected是受保护变量
类内和子类可直接访问,也就是说,基类中有protected成员,子类继承于基类,那么也可以访问基类的protected成员,要是基类是private成员,则对于子类也是隐藏的,不可访问
explicit关键字
只用于类内的单参数构造函数前面。由于无参数的构造函数和多参数的构造函数总是显示调用,这种情况在构造函数前加explicit无意义。
google的c++规范中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。所以google约定所有单参数的构造函数都必须是显示的, 只有极少数情况下拷贝构造函数可以不声明称explicit。例如作为其他类的透明包装器的类。
对象的生命周期
实例化类会调用构造,出作用域后调用析构
利用虚函数实现多态
子类重写虚函数,在调用传入基类时发生多态
类的构造如果是 virtual,则析构必须是virtual,这样析构时不会导致基类被析构,如果是纯虚函数,即virtual func = 0,该类只是个抽象类,无法实例对象
sizof c++
sizeof 空类 = 1 字节,增加virtual 后,会有虚指针(指向虚函数表) 4 字节
类的成员函数不占类的内存,编译器在编译时会给它起别名
C++所有的参数传递都是值拷贝,所以指针传入也会拷贝一份指针,只是名字不同,实际指向同一个地址空间
浅拷贝
默认的构造函数中 构造一个同类对象,当类成员中有指针,则初始化成员时也是仅仅是拷贝传入指针的值,也就是说此时两个对象(构造的对象和传入的对象)的成员指针都指向同一个地址, 两个实例化的对象析构时,会导致重复释放一块内存空间
深拷贝
我们自己提供拷贝构造函数,如果单独new 出来一个对象或其他,在析构时delete即可
消息协议设计
1.原始的 C struct message 缺点 每次发送的 message 都是固定大小的包 需要自己写大量处理数据的代码
2.序列化的方法:局限于C++ 的类
friend class boost::serialization::access Json 可以用不同语言的客户端,缺点需要构造成Json数据冗余信息多
protocol buffer
智能指针
智能指针有传染性,如果暴露的是外部接口则更容易传染
lambda表达式
lambda:是语法糖,重载了()
[b](int a){std::cout << "hello" << endl;}
//与下面的类相等
class Lambda {
public :
void operator()(int a) const {
std::cout << "hello" << std::endl;
}
Lambda(int b) : m_b(b){}
private:
int m_b
}
[this](){this->func} 在类中使用,调用该类中的成员函数
回调函数
将函数以函数指针的方式传递,通常认为是“注册了该函数”,调用并不是立即发生而是由使用者觉定调用的时机,如
xx.register(func* p) //注册回调参数,此时并未调用
xx.run //run中可能是开启了另一线程去调用 p
以回调的形式要注意,回调函数中的入参,是否失效,即是否生命周期还没完
函数模板
编译器先是检查语法,语法正确后,当遇到真正实现的地方时,才将传入的类型进行替换,确定占用的空间