C++基础+类和对象上

发布时间:2026/7/16 16:38:44

C++基础+类和对象上 c语言中的宏定义就是在预处理时替换展开但是宏定义容易出错所以c用内联函数来代替宏定义使用。4vs编译器的debug版本下默认是不展开inline的这样方便调试debug版本下想展开需要设置一下两个地方。代码语言javascriptAI代码解释#include iostream using namespace std; inline int Add(int x, int y) { return x y; } int main() { int ret Add(1, 2); cout ret endl; }这段代码运行后转到汇编指令下这样就减少了函数栈帧的建立。5inline 声明和定义不能分离到两个文件分离会导致连接错误。因为inline被展开就没有函数地址链接时会报错。因为内联函数是直接展开的默认是没有地址的。源码 #include test.h #include iostream using namespace std; int main() { int ret Add(1, 2); cout ret endl; } test.h声明 inline int Add(int x, int y); tpp.h定义 int Add(int x, int y) { return x y; }总的来说内联函数就是一种建议你写了编译器也不一定会用这个取决于编译器。如果内联函数可以随便用那么所有函数都可以展开都不用建立栈帧了。所以写了内联函数编译器会判断合不合适使用。二nullptrnullptr即为空指针也就是在c语言中使用的NULL。由于在c中NULL被宏定义为0所以在有些场景下会产生歧义。NULL会转化成0而nullptr不会它只能转化成指针。所以c中用nullptr解决这种问题。//c语言支持,c不支持 void* p1NULL; int* p2p1; //c中 void*p1nullptr; int* p2(int*)p1;类和对象部分1类的定义1.1类定义的格式class classname { //由成员函数和成员变量组成 };1class为定义类的关键字classname为类名 {}中为类的主体。类中的变量称为类的属性或类的成员变量类中的函数称为类的方法或成员函数。2为了区分成员变量一般在成员变量前加上_比如_i。3定义在类中的成员函数默认是内联函数。但是是否展开还是取决于编译器。4c中struct也可以定义类c兼容c语言的用法同时struct升级成了类与class定义类相比struct中的成员属性默认是public,而class默认是private.1.2访问限定符1c一种实现封装的方式用类将对象的属性与方法结合起来。通过访问权限选择性的将其接口提供给外部的用户使用。2public修饰的成员在类外可以直接访问private和protected修饰的成员在类外不可直接访问。3class没有被访问限定符修饰的默认时privatestruct 默认是public.代码语言javascriptAI代码解释class stack//定义一个类类名为stack { public://成员函数类外可直接访问 void push() {} void pop() {} int top() {} private://私有类外不可直接访问 int* _a;//成员变量名前加上_便于区分 int _top; int _capacity; }; int main() { //与结构体不同的是类名就是一个类型 //而在结构体中需要加上struct才是一个类型 stack st;//st为定义的对象 st.push(); st.pop();//调用成员函数 //st._top;//不可直接访问 }1.3类域类定义了一个新的作用域类的所用成员都在类的作用域中在类外定义时需加上域作用操作符来指明该变量在哪个域中。代码语言javascriptAI代码解释class Date { public: void Init(int year, int month, int day); private: int _year; int _month; int _day; }; void Date::Init(int year, int month, int day)//类外定义 { _year year; _month month; _day day; }2实例化2.1实例化概念1用类类型在物理内存中创建对象的过程称作类的实例化。2类实际上只是一个模型类内成员变量都没有分配空间只是声明。用类实例化出对象后才会分配空间。代码语言javascriptAI代码解释class Date { public: void Init(int year, int month, int day) { _year year; _month month; _day day; } void print() { cout _year 年 _month 月 _day 日 endl; } private: //成员变量的声明 int _year; int _month; int _day; }; int main() { //Date类实例化出对象d1,d2 Date d1; Date d2; d1.Init(2024, 7, 25); d1.print(); d2.Init(2024, 7, 15); d2.print(); return 0; }2.2对象大小1对象中的存储方式对象中只存储成员变量成员函数存放在公共代码区。2计算对象的大小和结构体一样都遵循内存对齐规则。a.第一个成员在与结构体偏移量为0的地址处。b.其他成员变量要对齐到某个数字对齐数的整数倍地址处。c.对齐数编译器默认的对齐数与该成员大小的较小值。d.结构体总大小为最大对齐数所有变量类型最大者与默认对齐数取最小的整数倍。e.如果嵌套了结构体嵌套的结构体对其到自己的最大对齐数的整数倍处。(3)计算Date类的大小4当类中没有成员变量时对象的大小是12.3this指针1在上面的Date类中有Init和print两个函数在我们调用的时候就不知道是要访问d1的数据还是d2的数据所以这里需要使用c中隐含的this指针来解决问题。2编译器编译后在每个成员函数的第一个形参位置会默认加上一个当前类类型的指针叫做this指针。

相关新闻