零碎的知识点 C++

目录

public修饰的成员变量

private修饰的成员变量

protected是受保护变量

explicit关键字

对象的生命周期

利用虚函数实现多态

sizof c++

浅拷贝

深拷贝

消息协议设计

智能指针

lambda表达式

回调函数

函数模板

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

以回调的形式要注意,回调函数中的入参,是否失效,即是否生命周期还没完

函数模板

编译器先是检查语法,语法正确后,当遇到真正实现的地方时,才将传入的类型进行替换,确定占用的空间

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值