• C++学习笔记15 - struct、class、const、mutable


    一、struct和class的区别

    1、C和C++中struct的区别

    • C中不支持成员函数(只能通过函数指针成员变量间接支持),而C++源生支持
    • C中不支持static成员,而C++中支持。
    • 访问权限,C中默认public,c++中默认public,但是可以显式指定public/private/protected 三者之一
    • 继承特性上,C中不支持(只能通过结构体包含来间接实现),而c++源生支持,且struct和class可以互相继承
    • 初始化方面,C中靠初始化式(gcc扩展了初始化语法),而c++靠构造函数所以初始化更自由可定制化

    2、c++中struct和class的区别

    • 默认成员权限,struct默认public,class默认private
    • 继承关系的权限管控,struct默认public,class默认private
    • struct和class交叉继承时,默认的权限管控取决于子类而不是基类
    • 模板相关使用都用class,而不用struct了

    3、总结

    • c++中struct和class差别不大,大多数情况下都可以直接替换使用而不出错
    • c++中struct其实有点“人格分裂”,它既要兼容C中的struct,又要像c++的class
    • 结论:除非是只需要打包几个变量数据就用C方式的struct,否则如果需要面向对象式编程就用class

    二、const和mutable

    1、const可以实现常函数

    • 常函数,就是class的成员函数承诺在函数内部不会修改class的任何成员变量,注意是任何一个
    • 思考:c++为什么设计常函数?还是为了class的设计者和使用者更好的协作,避免错误的使用类库

    2、mutable可以局部打破const常函数

    • const常函数承诺在函数内不会修改class的任何一个成员变量
    • 但是有时候个别成员变量,就是需要在const的常函数中也能修改(注意只是个别,其他大部分是不需要修改的)
    • 怎么办?2个解法:要么去掉const;要么使用mutable局部打洞
    • 思考:c++为什么设计mutable?和private一样,还是“先全部禁了再按需打开”的思路

    三、总结

    1、class的前置声明

    • 就是class的声明,安慰编译器的

    2、inline、member、function

    • 类的声明中直接写函数体,则此函数会被编译器inline化处理
    • 类的声明中正常处理,而成员函数的实现中加inline
    • inline的成员函数应该放在hpp中,而不是cpp中,这个一定要注意,因为inline是在编译时替换的
    class person
    {
    // 访问权限
    public:
    	// 属性
    	mutable string name;			// 名字
    	bool male;				// 性别,男为true,女为false
    	
    	person(){};
    	person(int myage);
    	
    	
    	// 方法
    	void eat(void);
    	void work(void);
    	void sleep(void);
    	void AgeAdd1(void);
    	int AgeGet(void) const;
    	
    	
    private:
    	mutable int age;				// 年龄
    };
    
    
    
    // 人长大了一岁,所以age++,所以这个方法不是一个常函数
    void person::AgeAdd1(void)
    {
    	this->age++;
    }
    
    
    // 本函数只是读取class的成员变量,并不修改,所以可以是常函数
    int person::AgeGet(void) const
    {
    	age++;
    	name = "ddd";
    	return this->age;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
  • 相关阅读:
    李宏毅2022机器学习HW4 Speaker Identification上(Dataset &Self-Attention)
    Seldom3.0: 支持App测试
    如何在linux 安装tar.gz二进制包
    Js面试手写题第二天
    PHP去除BOM头的方法
    express-generator生成nodejs服务基本骨架
    [运维|数据库] MySQL中的存储过程语句,在PostgreSQL中为什么是函数
    C#上位机系列(4)—示波器一新窗口的建立
    设计模式(二)-创建者模式(3)-抽象工厂模式
    C/C++中如何让程序接受并处理命令行参数
  • 原文地址:https://blog.csdn.net/qq_38958704/article/details/126291520