c++面向对象编程必备“良方”(欢迎大家来补充!)

2024-01-23 05:58

本文主要是介绍c++面向对象编程必备“良方”(欢迎大家来补充!),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/zhanxinhang/article/details/6786269


前言:c++面向对象中的繁琐机制,不得不让你在编程中频频“犯病”,找错误,找bug,困扰,是你的病源所在,本人虽不是什么“良医”, 却也算是总结出以下“良方”。注:难免会有记忆上的遗漏,知识上的不够,遗漏之处还需大家来补充啊!http://blog.csdn.net/zhanxinhang



药方1 ☞ 必需时刻明白面向对象编程中要扮演的两个角色,一个就是你,类的设计者,一个就是用户,类的使用者,你的设计是针对用户而言的,当然你也可能是身兼两职,同时是设计者又是用户。

药方2 ☞ 设计一个类时,将声明放于头文件,定义放在cpp文件中,因为类是给用户使用的,将声明放在头文件中,用户便可以方便使用,而定义在cpp文件中主要是为了两点,一提高编译效率,二避免用户包含文件后发生重定义。

药方3 ☞ 声明完一个类后必须以分号结束,因为声明完一个类后后面还可以加一个对象名,用来声明该类的实例化对象,分号‘;’ 不是表示声明的结束,而是表示声明该类对象的结束,如果单纯一个分号表示没有声明任一对象。

药方4 ☞ 避免在构造函数里实例化本类,否则会发生递归死循环。

药方5 ☞ 避免在析构函数里delete本类实例,否则会发生递归死循环。

药方6 ☞ inline成员函数必须在头文件里定义,因为inline函数本质是内联展开的,跟#define预编译类似。

药方7 ☞ hpp头文件里的类或函数必须在hpp头文件里定义,因为hpp的本质是让编译器只对hpp文件里的内容编译一次,然后将目标代码附到cpp目标文件中。

药方8 ☞ hpp头文件里的全局变量必须声明为static 否则会发生重编译,static本质是让编译器只定义一次。

药方9 ☞ const 数据成员必须要在初始化列表中赋初值(c++11中也可以直接=号赋值),因为它是const变量。

药方10☞ const成员函数不允许你修改类的数据成员。因为它就是不予许。

药方11☞ 指向const对象的指针访问成员函数时,只能访问const成员函数,因为指向const对象的指针不予许你修改它所指向的内存的值,而const成员函数不修改类对象数据内存的值,它们俩正好互相吻合。

药方12☞ static数据成员需要在类外定义,它本质上并非属于包含它的类。

药方13☞ static成员函数不包含this指针,因为它本质上并非属于本类。

药方14☞ 如果类中的某一指针数据成员指向分配的内存空间,则一般的做法是定义析构函数,在析构函数里释放它所指的内存空间。因为类的生命周期结束时,如果没有定义析构函数,则会调用编辑器合成的析构函数,而该合成的析构函数不会智能地释放数据成员指针所指向的内存,所以必须在类结束之前释放它指向的内存。还有另一种做法就是将该成员指针定义为智能指针类型。

药方15☞ 操作符重载不能重载两个内置类型的对象,至少要有一个为类类型或枚举类型。因为重载两个内置类型的对象完全没有必要。

药方16☞ 赋值操作符重载(operator=),不宜设为虚函数,因为赋值操作符中的指针或引用函数参数有可能是指向基类对象也有可能是指向派生类对象,因此容易发生混淆。

药方17☞ 在继承层次中,基类应该定义一个虚析构函数,因为非虚析构函数不会被继承,而虚析构函数会在派生类定义析构函数时发生重定义(就是虚表指针指向了派生类的析构函数)。在利用基类指针实现多态时,基类指针指向了新开辟(new)的派生类对象,这时由于基类的析构函数是虚的,所以再利用基类指针释放(delete)掉派生类对象内存时,就可以顺利地执行派生类的析构函数了。

药方18☞ 模板类或函数,在头文件中声明,并且,定义也要在此头文件中(一般采用hpp头文件),因为模板特化机制实际上是编译时利用模板参数产生可以兼容实例的目标代码附于使用它的cpp文件中(特化),从而实现多态,而不能预先产生目标代码就兼容实例的。

药方19☞ 声明友元之前必须对该声明友元的对象,进行声明或定义。因为你让我跟他交朋友,可以,但你必需让我知道他的为人吧。^_^

药方20☞ 你所知的只是沧海一粟,切莫过于骄傲和自满。


结语:良药苦口!...

这篇关于c++面向对象编程必备“良方”(欢迎大家来补充!)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/635418

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

C++ 多态性实战之何时使用 virtual 和 override的问题解析

《C++多态性实战之何时使用virtual和override的问题解析》在面向对象编程中,多态是一个核心概念,很多开发者在遇到override编译错误时,不清楚是否需要将基类函数声明为virt... 目录C++ 多态性实战:何时使用 virtual 和 override?引言问题场景判断是否需要多态的三个关

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf