一、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的前置声明
2、inline、member、function
- 类的声明中直接写函数体,则此函数会被编译器inline化处理
- 类的声明中正常处理,而成员函数的实现中加inline
- inline的成员函数应该放在hpp中,而不是cpp中,这个一定要注意,因为inline是在编译时替换的
class person
{
public:
mutable string name;
bool male;
person(){};
person(int myage);
void eat(void);
void work(void);
void sleep(void);
void AgeAdd1(void);
int AgeGet(void) const;
private:
mutable int age;
};
void person::AgeAdd1(void)
{
this->age++;
}
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