大厂做网站shijuewang济宁住房和城乡建设厅网站首页

张小明 2025/12/28 0:58:04
大厂做网站shijuewang,济宁住房和城乡建设厅网站首页,郑州男科医院十大排名,杭州排名优化公司电话类和对象(上) 类定义格式 • class为定义类的关键字#xff0c;Stack为类的名字#xff0c;{}中为类的主体#xff0c;注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。 • 为…类和对象(上)类定义格式• class为定义类的关键字Stack为类的名字{}中为类的主体注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。• 为了区分成员变量⼀般习惯上成员变量会加⼀个特殊标识如成员变量前⾯或者后⾯加_ 或者 m开头注意C中这个并不是强制的只是⼀些惯例具体看公司的要求。• C中struct也可以定义类C兼容C中struct的⽤法同时struct升级成了类明显的变化是struct中可以定义函数⼀般情况下我们还是推荐⽤class定义类。• 定义在类⾯的成员函数默认为inline。#includeiostream using namespace std; class Stack { public: // 成员函数 void Init(int n 4) { array (int*)malloc(sizeof(int) * n); if (nullptr array) { perror(malloc申请空间失败); return; } capacity n; top 0; } void Push(int x) { // ...扩容 array[top] x; } 27 int Top() 28 { 29 assert(top 0); 30 31 return array[top - 1]; 32 } 33 34 void Destroy() 35 { 36 free(array); 37 array nullptr; 38 top capacity 0; 39 } 40 41 private: 42 // 成员变量 43 int* array; 44 size_t capacity; 45 size_t top; 46 }; // 分号不能省略 47 48 int main() 49 { 50 Stack st; 51 st.Init(); 52 st.Push(1); 53 st.Push(2); 54 55 cout st.Top() endl; 56 57 st.Destroy(); 58 59 return 0; 60 }访问限定符• C⼀种实现封装的⽅式⽤类将对象的属性与⽅法结合在⼀块让对象更加完善通过访问权限选择性的将其接⼝提供给外部的⽤⼾使⽤。• public修饰的成员在类外可以直接被访问protected和private修饰的成员在类外不能直接被访问protected和private是⼀样的以后继承章节才能体现出他们的区别。• 访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌如果后⾯没有访问限定符作⽤域就到 }即类结束。• class定义成员没有被访问限定符修饰时默认为privatestruct默认为public。• ⼀般成员变量都会被限制为private/protected需要给别⼈使⽤的成员函数会放为public。类域• 类定义了⼀个新的作⽤域类的所有成员都在类的作⽤域中在类体外定义成员时需要使⽤ :: 作⽤域操作符指明成员属于哪个类域。• 类域影响的是编译的查找规则下⾯程序中Init如果不指定类域Stack那么编译器就把Init当成全局函数那么编译时找不到array等成员的声明/定义在哪⾥就会报错。指定类域Stack就是知道Init是成员函数当前域找不到的array等成员就会到类域中去查找。#includeiostream using namespace std; class Stack { public: // 成员函数 void Init(int n 4); private: // 成员变量 int* array; size_t capacity; size_t top; }; // 声明和定义分离需要指定类域 void Stack::Init(int n) { array (int*)malloc(sizeof(int) * n); if (nullptr array) { perror(malloc申请空间失败); return; } capacity n; top 0; } int main() { Stack st; st.Init(); return 0; }上⾯的程序运⾏后我们看到没有成员变量的B和C类对象的⼤⼩是1为什么没有成员变量还要给1个字节呢因为如果⼀个字节都不给怎么表⽰对象存在过呢所以这⾥给1字节纯粹是为了占位标识对象存在。内存对⻬规则• 第⼀个成员在与结构体偏移量为0的地址处。• 其他成员变量要对⻬到某个数字对⻬数的整数倍的地址处。• 注意对⻬数 编译器默认的⼀个对⻬数 与 该成员⼤⼩的较⼩值。• VS中默认的对⻬数为8• 结构体总⼤⼩为最⼤对⻬数所有变量类型最⼤者与默认对⻬参数取最⼩的整数倍。• 如果嵌套了结构体的情况嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处结构体的整体⼤⼩就是所有最⼤对⻬数含嵌套结构体的对⻬数的整数倍。内存对齐效率更高一点因为如果要单独读取某个数据的时候只需要读取一遍this指针• Date类中有 Init 与 Print 两个成员函数函数体中没有关于不同对象的区分那当d1调⽤Init和Print函数时该函数是如何知道应该访问的是d1对象还是d2对象呢那么这⾥就要看到C给了⼀个隐含的this指针解决这⾥的问题• 编译器编译后类的成员函数默认都会在形参第⼀个位置增加⼀个当前类类型的指针叫做this指针。⽐如Date类的Init的真实原型为 void Init(Date* const this, int year,int month, int day)• 类的成员函数中访问成员变量本质都是通过this指针访问的如Init函数中给_year赋值 this-_year year;• C规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理)但是可以在函数体内显⽰使⽤this指针。#includeiostream using namespace std; class Date { public: // void Init(Date* const this, int year, int month, int day) void Init(int year, int month, int day) { // 编译报错error C2106: “”: 左操作数必须为左值 // this nullptr; // this-_year year; _year year; this-_month month; this-_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(d1, 2024, 3, 31); d1.Init(2024, 3, 31); d1.Print(); d2.Init(2024, 7, 5); d2.Print(); return 0; }这段代码看起来有问题但让我先分析一下int main() { A* p nullptr; // 创建一个指向A类的空指针 p-Print(); // 通过空指针调用成员函数 return 0; }代码分析问题所在p被初始化为nullptr空指针p-Print()试图通过空指针调用成员函数运行结果理论上这会导致未定义行为通常会导致程序崩溃段错误但实际上可能运行成功的原因成员函数的调用机制p-Print()在编译时被转换为A::Print(p)Print函数没有访问成员变量函数内部没有使用this指针访问数据成员编译器优化由于不需要访问对象数据函数可以正常执行验证测试class A { public: void Print() { cout A::Print() endl; // 如果加上这行就会崩溃 // cout _a endl; // 访问成员变量需要有效的this指针 } void PrintWithData() { cout Data: _a endl; // 这里会崩溃 } private: int _a 10; }; int main() { A* p nullptr; p-Print(); // 可能正常运行 // p-PrintWithData(); // 一定会崩溃 return 0; }重要结论这是未定义行为不要在实际代码中这样写虽然可能侥幸运行成功但依赖于编译器和具体实现安全的做法确保指针不为空再调用成员函数这是一种危险的编程实践应该避免this指针存在内存哪个区域的 ()A. 栈 B.堆 C.静态区 D.常量区 E.对象⾥⾯正确答案是A. 栈详细解释this指针的本质this是一个隐式的函数参数当调用成员函数时编译器自动将对象的地址作为第一个参数传递示例说明class MyClass { public: void print() { // 编译器实际上将 this 作为第一个参数传递 // void print(MyClass* this); } }; int main() { MyClass obj; obj.print(); // 相当于 print(obj); MyClass* ptr new MyClass(); ptr-print(); // 相当于 print(ptr); return 0; }内存区域分析栈this指针本身作为函数参数存储在栈中 ✓堆如果对象是用new创建的对象本身在堆中但this指针仍在栈中静态区存储全局变量和静态变量常量区存储字符串常量等对象里面this指向对象但本身不在对象内部函数调用时的内存布局栈帧stack frame | 返回地址 | | 参数n | | ... | | 参数1 | ← this指针在这里作为第一个隐式参数 | 局部变量|总结this指针是成员函数的隐式参数与其他函数参数一样存储在栈中。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

电子商务网站商品怎么来河南宝盈建设工程有限公司网站

情绪识别反馈系统:让AI学会“读空气”的对话艺术 在客服聊天窗口里,一句“你们的服务太差了”背后可能是愤怒的爆发,也可能是疲惫中的抱怨;而“谢谢,不过我还是没明白”这样礼貌的表达下,或许藏着即将流失用…

张小明 2025/12/27 6:21:10 网站建设

阿里云t5做网站宣传画册设计

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

张小明 2025/12/27 6:21:08 网站建设

做seo推广网站在线咨询手机设计网站

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

张小明 2025/12/27 6:21:07 网站建设

微网站公司门户网站建设内

对于科研工作者、高校教师及在读研究生而言,期刊论文发表是学术生涯的 “硬指标”。但现实往往充满挫败感:耗费数月打磨的稿件,因重复率超标被直接退回;精心撰写的内容,因表达不专业、逻辑不严谨错失录用机会&#xff…

张小明 2025/12/27 6:21:05 网站建设

录音转文字网站开发seo的基本工作内容

如果你是正在为论文焦头烂额的研究生,每天面对堆积如山的资料却不知如何下笔;或是担心论文进度缓慢,害怕无法按时毕业的科研人;又或是为了论文大纲反复修改,被导师多次打回的毕业生,那么这篇文章就是为你量…

张小明 2025/12/27 6:21:03 网站建设

平面设计网站免费大推荐门户网站设计与开发

C++ 多线程编程入门指南 引言 在计算机科学中,多线程编程是一种提高程序性能和响应速度的有效方法。C++ 作为一种强大的编程语言,提供了丰富的多线程编程工具。本文将详细介绍 C++ 多线程编程的基础知识,包括线程的创建、同步、通信以及多线程编程的最佳实践。 线程的创建…

张小明 2025/12/27 7:57:04 网站建设