首页 > 编程语言 >《C++编程规范》六、构造、析构与复制

《C++编程规范》六、构造、析构与复制

时间:2024-09-13 17:15:31浏览次数:1  
标签:初始化 顺序 firstName lastName 成员 编程 C++ 析构 构造函数

目录

使用这些函数之所以需要小心,其中一个原因是几乎一半的情况下编译器都会为我们生成代码。另一个原因是,C++ 默认时总是将类当作类似于值的类型,但是实际上并非所有的类型都类似于值(见第32条)。 知道何时应该显式地编写(或者禁止)这些特殊成员函数,并遵循本部分中的规则和准则来编写,将有助于确保代码的正确性、可扩展性和防错性。

本部分中我们选出的最有价值条款是第51条:析构函数、释放和交换绝对不能失败。


第47条 以同样的顺序定义和初始化成员变量

与编译器一致:成员变量初始化的顺序要与类定义中声明的顺序始终保持一致,不用考虑构造函数初始化列表中编写的顺序。要确保构造函数代码不会导致混淆地指定不同的顺序。

考虑以下代码:

class Employee {
  string email_, firstName_, lastName_;
public:
  Employee( const char* firstName, const char* lastName )
  : firstName_(firstName), lastName_(lastName), email_(firstName_ + "." + lastName_ + "@acme.com") {}
};

这段代码隐藏着一个错误,危害性很大,而且很难发现。因为类定义中 email_是在 first_和last_之前被声明的,它将首先被初始化,然后试图使用其他未初始化的字段。更糟糕的是,如果构造函数的定义位于另一个文件夹,成员变量声明的顺序对构造函数的正确性的远距离影响就更难确定了。

C++ 语言之所以采取这样的设计,是因为要确保销毁成员的顺序是惟一的;否则,析构函数将以不同顺序销毁对象,具体顺序取决于构造对象的构造函数。为此带来的底层操作开销应该是不可接受的。

解决方案是,总是按成员声明的顺序编写成员初始化语句。这样,任何非法依赖都会显而易见。当然,尽量不让一个成员的初始化依赖于其他成员更好

许多编译器(但不是所有)在我们违反了此条规则时会发出警告。



标签:初始化,顺序,firstName,lastName,成员,编程,C++,析构,构造函数
From: https://www.cnblogs.com/yubo-guan/p/18412551

相关文章

  • ros 自定义消息(图像+标志位+位姿)python和c++发布和接受
      编译 脚本 v3_gaosi_img_pose_flag.sh#!/bin/bash#外部给与执行权限#sudochmod+xrun_ros_nodes.sh#定义ROS安装路径#安装时候添加到系统路径了不需要每次都sourceROS_SETUP="/opt/ros/noetic/setup.bash"#定义工作目录路径自己的工程没有加到系......
  • 【编程小白必看】使用Selenium进行网页自动化操作操作秘籍一文全掌握
    【编程小白必看】使用Selenium进行网页自动化操作操作秘籍......
  • 为什么那么多开源软件都用netty来做网络通信编程框架?
     1、用netty来做网络通信编程框架而不是我们自己去基于JDKNIO来编程的好处有如下这些:(1)、netty支持常见的应用层协议(如:HTTP、FTP、DNS等),还可以支持自定义协议;(2)、netty可以自动解决网络编程当中的粘包与半包问题;(3)、netty还可以支持流量整形;(4)、netty对于网络通信当中......
  • 编程小白如何成为大神?大学新生的最佳入门攻略
    方向一:编程语言选择选择原则:兴趣驱动:选择自己感兴趣的编程语言开始学习,兴趣是最好的老师。实用性:考虑语言的实用性,如Python、Java、C++等都是广泛使用的编程语言。职业目标:根据未来职业规划选择语言,例如想做数据分析可以学Python,想做安卓开发可以学Java。推荐语言:Python:语法简洁,易......
  • C++--模板
    1泛型编程如何将Swap实现乘成一个通用的交换函数voidSwap(int&left,int&right){inttemp=left;left=right;right=temp;}voidSwap(double&left,double&right){doubletemp=left;left=right;right=temp;}voidSwap......
  • vc++ 6.0 实现代码的多行注释与取消注释功能(实测有效)
    方式一1.新建MacroFile宏文件点击菜单栏“文件→新建(File→New)”选项,在“新建(New)”弹框中,顶部区域选项“文件(File)”下找到MacroFile,点击,并在右边输入“文件名”,点击“确定(OK)”按钮。此时弹出“新建宏文件”窗口,在“描述(Descripion)”输入框中输入信息,点击“确定(OK)”按钮。......
  • C++并发编程的学习(9-13)
    文章来源:恋恋风辰的编程笔记https://gitbookcpp.llfc.club/sections/cpp/concurrent/concpp02.html容器存储:thread类没有拷贝构造函数,所以使用容器存储它时,不能使用push_back(),需要使用点击查看代码voiduse_vector(){std::vector<std::thread>threads;for(u......
  • 南沙C++信奥老师解一本通题: 1212:LETTERS
    ​ 题目描述】给出一个row×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。【输入】第一行,输入字母矩阵行数R和列数S,1≤R,S≤20。接着输出R行S列字母矩阵。【输出】最多能走过的不同字母......
  • Dev-C++小游戏大全(第三期)
    1.魔法世界#include<iostream>#include<string>#include<windows.h>#include<conio.h>#include<fstream>#include<ctime>#include<time.h>#include<stdio.h>usingnamespacestd;intD_Of_C,OK,ane,xy,D......
  • C++ const 对象
    默认状态下,const对象仅在文件内有效。constintbufSize=512;//输入缓冲区大小编译器将在编译过程中把用到该变量的地方都替换成对应的值。也就是说,编译器会找到代码中所有用到bufsize的地方,然后用512替换。某些时候有这样一种const变量,它的初始值不是一个常量表达式,但......