C和C++中struct的区别
(1)C中不支持成员函数(只能通过函数指针成员变量间接支持),而C++源生支持。
(2)C中不支持static成员,而C++中支持。后面会详细讲,C++ static class是一个大知识点
(3)访问权限,C中默认public,C++中默认public,但是可以显式指定public/private/protected三者之一
(4)继承特性上,C中不支持(只能通过结构体包含来间接实现),而C++源生支持,且struct和class可以互相继承
(5)初始化方面,C中靠初始化式(gcc扩展了初始化语法),而C++靠构造函数所以初始化更自由可定制化
-
C++中struct和class的区别
(1)默认成员权限,struct默认public,class默认private
(2)继承关系的权限管控,struct默认public,class默认private
(3)struct和class交叉继承时,默认的权限管控取决于子类而不是基类
(4)模板相关使用都用class,而不用struct了 -
总结
(1)C++中struct和class差别不大,大多数情况下都可以直接替换使用而不出错
(2)C++中struct其实有点“人格分裂”,他既要兼容C中struct,又要像C++的class
(3)结论:除非是只需要打包几个变量数据就用C方式的struct,否则如果需要面向对象式编程就用class
const和mutable是干嘛的
-
const可以实现常函数
(1)常函数,就是class的成员函数承诺在函数内部不会修改class的任何成员变量,注意是任何一个
(2)常函数演示案例
(3)思考:C++为什么设计常函数?还是为了class的设计者和使用者更好的协作,避免错误的使用类库 -
mutable可以局部打破const常函数
(1)const常函数承诺在函数内不会修改class的任何一个成员变量
(2)但是有时候个别成员变量,就是需要在const的常函数中也能修改(注意只是个别,其他大部分是不需要修改的)
(3)怎么办?2个解法:要么去掉const,要么使用mutable局部打洞
(4)mutable使用演示
(5)思考:C++为什么设计mutable?和private那里一样,还是“先全部禁了再按需打开”的思路。
mutable关键字只能修饰数据成员,而不能修饰方法
#include <iostream>
#include <string>class ClassInfo {
private:std::string className;int classSize;mutable int accessCount; // 使用mutable关键字public:ClassInfo(const std::string &name, int size): className(name), classSize(size), accessCount(0) {}std::string getClassName() const {++accessCount; // 修改mutable成员变量return className;}int getClassSize() const {++accessCount; // 修改mutable成员变量return classSize;}int getAccessCount() const {return accessCount;}
};int main() {ClassInfo classInfo("Mathematics", 30);std::cout << "Access Count: " << classInfo.getAccessCount() << std::endl;std::cout << "Class Name: " << classInfo.getClassName() << std::endl;std::cout << "Class Size: " << classInfo.getClassSize() << std::endl;std::cout << "Access Count: " << classInfo.getAccessCount() << std::endl;return 0;
}
class的前置声明
(1)就是class的声明,安慰编译器的
(2)看到了认识即可
#include <iostream>// 前置声明
class ClassB;class ClassA {
public:void setClassB(ClassB* b);void showClassB();
private:ClassB* b;
};class ClassB {
public:ClassB(int value) : value(value) {}int getValue() const { return value; }
private:int value;
};void ClassA::setClassB(ClassB* b) {this->b = b;
}void ClassA::showClassB() {if (b) {std::cout << "ClassB value: " << b->getValue() << std::endl;} else {std::cout << "ClassB is not set." << std::endl;}
}int main() {ClassA a;ClassB b(42);a.setClassB(&b);a.showClassB();return 0;
}
- class ClassB 在 ClassA 之前进行了前置声明。
- 在 ClassA 中,我们声明了一个 ClassB* b 指针。
- ClassB 的完整定义出现在 ClassA 之后。
- 这样做允许我们在 ClassA 的成员函数中使用 ClassB 的指针,而不需要在 ClassA 的头文件中包含 ClassB 的完整定义。
inline member function
(1)类的声明中直接写函数体,则此函数会被编译器inline化处理
(2)类的声明中正常处理,而成员函数的实现中加inline
(3)inline的成员函数应该放在hpp中而不是cpp中,这个一定要注意,因为inline是在编译时替换的
- 本课程总结
(1)本课程主要在讲C++的封装特性,以及由此引发的各种细节语法特性。
(2)语法上掌握是第一层,会写代码跑起来是第二层,遇到问题能调出来是第三层,理解设计原理是第四层。
总结
const使用方法、
理解什么是mutable局部打洞
理解什么是前置声明
类声明里面写函数实体,就是inline化
学习记录,侵权联系删除。
来源:朱老师物联网大课堂