C++-必知必会_赋值和初始化并不相同(条款12)

条款12:拷贝对象的所有部分 任何时候,只要你承担起“为派生类编写拷贝函数”的责任,就必须同时确保“基类成分也被正确复制”。所谓“复制每一个成分”,指的正是同时涵盖。:“条款5”表明,当程序需要时,编译器会自动生成拷贝函数。以避免代码重复(见“实现1”和“实现2”)。:当两个拷贝函数之间有着实质等价的实现时(往往如此),:将拷贝函数的共同逻辑提取到一个独立的成员函数(通常。正确复制(正确取值并执行拷贝赋值运算符函数):手工编写(而非由编译器创建)拷贝函数。:在实现拷贝函数时,必须确保(1)“显式调用”相应的基类拷贝函数。 阅读详情
/***********************************************************************
 * C++必知必会   条款12
 * 赋值和初始化并不相同
 * 
 *        赋值发生在你赋值时,除此之外,遇到所有其它的复制情形均为初始化.包括声明、函数返
 * 回、 参数传递以及捕获异常中的初始化.
**********************************************************************
*/

    
int a = 12;  //初始化,将0x000c复制给a
    a = 12;       //赋值,将0x000c复制给a

    
class String
    
{
        
private:
            
char *s_;
        
public:
            String(
const char *init);
            String 
&operator = (const char *str);
        
//...
    }
;

    
//初始化
    String::String(const char *init) //构造函数
    {
        
if(!init)    init = "";
        s_ 
= new char(strlen(init)+1); //注意这句,赋值里可没有.赋值会假定已经分配内存区域.
        strcpy(s_,init);
    }


    
//赋值
    String &String::operator = (const char *str)
    
{
        
if(!str)    str = "";
        
char *tmp = strcpy(new char[strlen(str)+1],str);
        delete[] s_; 
//类似于 析构
        s_ = tmp;    //类似于 构造
        return *this;
    }

/***********************************************************************
 * 赋值有点像一个析构动作后跟了一个构造动作.
 *        目标左侧(this)在采用源(右侧,str)重新初始化之前,必须被清理掉.
 *        由于一个正当的赋值操作会清掉左边的实参,因此永远不要对一个未初始化的存储区执行
 * 用户自定义的赋值操作.
**********************************************************************
*/


    String 
*names = static_cast<String*>(::operator new(BUFSIZ));
    names[
0] = "Oh,wrong!";    //赋值 wrong
/***********************************************************************
 *        上例中,因为我们直接调用了operator new,避免了String默认构造函数执行隐式的初始
 * 化,因此names此时指向一块随机们的内存.在执行赋值操作时,试图执行delete[]操作,出错!
**********************************************************************
*/
 
Effective C++ 第三版 所有条款总结及对应代码描述(纯干货) Effective C++ 第三版 所有条款总结及对应代码描述(纯干货) 阅读详情

相关推荐

《Effective C++》 读书笔记(详细总结55条款)上篇

下面从四个方面来说 (1) C++ 以 C 为基础,很多语句语法都没有改变,只是进行了扩展,C++ 解决问题的时候,可以理解为 C 的高效解法 (2) 面向对象,有构造函数,析构函数,继承、封装、多态、虚函数动态绑定,这是不同于C 语言的部分 (3) 泛型编程、可以理解为代码的模型,但是代码本身并不占用内存空间,只有在实例化的时候,才分配内存,所以可以提高代码复用性

身在边城 心在编程 2499

C++搞懂深拷贝初始化=与赋值(运算符重载)=的区别

C++搞懂深拷贝初始化=与赋值=的区别 代码 今天在学习右值引用时,遇到了深拷贝问题,以前也知道深拷贝与浅拷贝的区别,今天的疑问是,为什么不用重载=操作符在初始化时实现深拷贝,与赋值时=号的区别。 #include <iostream> #include <functional> using namespace std; class Test { private: int *data; int s_size; public: Test(size_t size

勿在浮沙築高台 1517

ETL数据集成案例

一个典型的ETL数据集成案例是将多个来源的数据合并成一个数据集。假设有一个公司,该公司使用一些不同的系统来存储不同部门的数据,例如销售数据存储在一个CRM系统中,财务数据存储在一个ERP系统中,人力资源数据存储在一个HR系统中。为了更好地进行报告和分析,该公司决定将所有这些数据集成到一个数据仓库中。以下是实现这一目标的ETL过程的步骤:提取(Extract):首先,需要从每个系统中提取所需的数据。每个系统可能有不同的数据格式和结构,因此需要编写不同的提取程序或查询来提取数据。

runqu的博客 948

初始化与赋值的区别

1,初始化与赋值 初始化是从无到有的过程,先分配空间,然后再填充数据; 赋值是对己有的对象进行操作。 对于基本数据类型,二者是没有任何区别,对于非基本数据类型,在写法与效率上有许多不同。 memset函数原型 #include void *memset(void *s, int c, size_t n); 表明将s指向的n个大小的区域,初始化值为c 2,结构体初始化与赋值 定义

mao_2110901055的专栏 9085

【AAOS】【源码分析】用户管理(五)-- MUMD介绍

MUMD(多用户多屏显示)是Android Automotive OS为车载多乘员场景设计的功能,支持不同座位用户独立操作各自屏幕。

码农的历程 1511

Vercel静态站被墙别慌!手把手教你用Cloudflare免费CDN+域名解析搞定DNS污染

本文详细介绍了如何利用Cloudflare免费CDN和域名解析解决Vercel静态网站遭遇DNS污染的问题。通过诊断DNS污染、设计Cloudflare解决方案架构、实战配置步骤以及高级调优技巧,帮助用户快速恢复站点访问并提升防护能力。

weixin_27442001的博客 677

C++中的对象的赋值和复制

对象的赋值 如果对一个类定义了两个或多个对象,则这些同类的对象之间可以互相赋值,或者说,一个对象的值可以赋给另一个同类的对象。这里所指的对象的值是指对象中所有数据成员的值。 对象之间的赋值也是通过赋值运算符“=”进行的。本来赋值运算符“=”只能用来对单个的变量赋值,现在被扩展为两个同类对象之间的赋值,这是通过对赋值运算符的重载实现的。 实际上这个过程是通过成员复制来实现的,即将一个对...

weixin_33739523的博客 530

从零到一:TI AWR1843 Boost EVM与DCA1000 EVM的ADC数据采集实战指南

本文详细介绍了TI AWR1843 Boost EVM与DCA1000 EVM的ADC数据采集实战指南,涵盖硬件连接、软件配置、固件烧录、雷达参数设置及数据处理等关键步骤。通过MATLAB等工具,开发者可高效实现毫米波雷达数据采集,适用于自动驾驶、工业检测等领域。

weixin_29001327的博客 967

C++中多个参数的初始化顺序问题

C++中多个参数的初始化顺序问题 决定参数初始化顺序的因素 1.跟参数列表的初始化顺序无关 2.取决于声明对象的顺序 实例 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<new> using namespace std; class A { public: A(int x) :m_x(x) { cout << "A::A(int)" << endl; } priva

qq_42613519的博客 867

博途PLC信号处理系列之卡尔曼滤波程序(Kalman Filter)

三菱系列PLC的卡尔曼滤波程序,可以参看下面这篇博文PLC滤波算法之卡尔曼滤波(kalmanFilter)代码+测试_RXXW_Dor的博客-优快云博客_plc滤波kalman滤波是采用递归的方法解决线性滤波问题,只需要当前的测量值input(西门子PLC里比如我们的模拟量通道AIW0值)和前一个采样周期的估计值(上一个时刻的滤波输出结果last_out)就能进行状态估计,需要的存储空间小,每一步的计算量小。下面我们通过程序代码一一给大家展示下。注意。......

RXXW_Dor的博客 3475

适航文章汇总:知识体系全面梳理

无论您是行业新手还是经验丰富的专业人士,都可以通过本篇文章快速查找相关资料,提高对适航认证、机载系统、软件及硬件等领域的理解。本部分详细解析ARP 4754A、ARP 4761、DO-178C、DO-254等核心标准,并介绍其在机载系统开发中的应用。介绍FAA、EASA、CCAR等主要航空管理机构的适航规章体系,并说明各类飞行器(如固定翼、旋翼机、无人机等)的适航要求。本部分还探讨硬件设计、验证与确认过程中的挑战。从系统架构设计到机载设备的集成与管理,本部分介绍机载系统的研发体系及适航管理的最佳实践。

qq_41854911的博客 1451

C++变量初始化规则

下面为大家简单地讲解一下C++中变量初始化的若干规则,限于本人学识有限,定有不详或不正确之描述,还望午饭们发扬找不到错误不罢休的精神,多多指点纠正,这样我也好及时修改自己的文章,为午饭们提供更好更有用的基础学习贴。----------------------------------------------------------------------------------...

weixin_33711641的博客 212

windows server 2012安装升级MySQL

本篇文章主要介绍的是windows server 2012 R2操作系统安装升级以及过程中遇到的问题和对应的解决方法。(数据库低版本为:mysql-5.7.27-winx64;数据库数据库高版本为:mysql-5.7.44-winx64;提示:以下是本篇文章正文内容,下面案例可供参考。

qq_42776231的博客 780

C++初始化和赋值的区别

1.C++中, 对于简单类型的赋值和初始化的区别基本可以忽略2.当涉及到类或者复杂的数据类型时,问题就变得不那么简单了,下面以一个例子来引入话题:#include &lt;iostream&gt;using namespace std;class Point  {  public:      Point(int a=0, int b=0):x(a), y(b){};      ~Point(){ ...

qq_38211852的博客 1万+

DeepSmote:一种深度SMOTE方法

DeepSmote 一种全新的将深度学习与Smote相结合的过采样方法! 目前在许多领域已经被使用,值得大家关注学习!

走在深度学习前沿的小宋 1447

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

条款12:尽量使用初始化而不要在构造函数里赋值

而在构造函数里赋值时,将有两个被调用。养成尽可能使用成员初始化列表的习惯,不但可以满足const和引用成员初始化的要求,还可以大大减少低效地初始化数据成员的机会。然而你可以利用固定数据类型的(非const, 非引用)对象其初始化和赋值没有操作上的不同的特点,安全地将成员初始化列表用一个对普通的初始化函数的调用来代替。(对有基类的对象来说,基类的成员初始化和构造函数体的执行发生在派生类的成员初始化和构造函数体的执行之前)这个类的定义要求使用一个成员初始化列表,因为const成员只能被初始化,不能被赋值。

qq_41237850的博客 529

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Effective C++ 2 构造/析构/赋值运算 条款5-条款12

条款05 了解C++默默编写并调用了哪些函数 条款06 若不想使用编译器自动生成的函数,就该明确拒绝 条款07 为多态基类声明虚析构函数 条款08 别让异常逃离析构函数 条款09 不在构造和析构过程中调用虚函数 条款10 令operator=返回*this的引用(reference to * this) 条款11 在operator=中处理“自我赋值” 条款12 复制对象时勿忘每一个成分

ambition_zhou的博客 177

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++类的成员初始化 与 赋值

条款12:   尽量使用初始化而不要在构造函数里赋值         看这样一个模板,它生成的类使得一个名字和一个t类型的对象的指针关联起来。         template     class   namedptr   {     public:         namedptr(const   string&   initname,   t   *initptr);         ...

鹏程万里--扬帆起航 2818

[转]C++初始化和赋值的区别

1.C++中, 对于简单类型的赋值和初始化的区别基本可以忽略 2.当涉及到类或者复杂的数据类型时,问题就变得不那么简单了,下面以一个例子来引入话题: #include <iostream> using namespace std; class Point { public: Point(int a=0, int b=0):x(a), y(b){}; ...

qq_42899794的博客 181

【C++】对象的定义、初始化与赋值

定义 int a; 编译器将在栈上为变量a分配一块内存空间,但并不会对其进行写入,也就是说,当前x内的值是未知的。 读取未被初始化的值将引发不确定的行为:可能会直接让程序崩溃,也可能让系统的逻辑出现错误。 赋值 int a; a = 1; 编译器将为变量a在栈上分配一块内存空间,之后将1赋给a。 初始化 对于内置类型: int a = 1; 在定义时可以直接初始化a 对于自定义类型: 对于类类型的初始化,C++规定对象的成员变量的初始化动作发生在进入构造函数本体之前,发生在这些成员的缺省构造函数自动调

记录学习的点滴 1904

《Effective C++》条款4:确定对象被使用前已被初始化

为内置型对象进行手工初始化,因为c++不保证会初始化他们构造函数使用初始化列表来初始化成员变量,而不要在构造函数内对他们另外赋值。初始化列表中变量的出现顺序尽量和他们的声明顺序相同为免除“跨编译单元的初始化次序”问题,使用的方式以对象替换对象。

2301_80345648的博客 1094

[Effective C++]条款4 初始化

本条讨论如何安全高效地实现初始化, 当然也有一些条件奇葩的初始化值得我们去讨论

tianmu_sama的博客 1110

Effective C++构造/析构/赋值运算 条款03-12

若想在const成员函数中修改成员变量,需要在成员变量前加mutable class CTextBlock { std::size_t length() const; private: char* pText; mutable size_t textLength; //这些成员变量可能总是会被修改 mutable bool lengthIsValid; //即使在const成员函数内 }; size_t CTextBlock::length() const { if (!lengthIsVa

a764695611的博客 273

条款 12: 尽量使用初始化而不要在构造函数里赋值

看这样一个模板,它生成的类使得一个名字和一个 T 类型的对象的指针关联起来。 template class NamedPtr { public: NamedPtr(const string& initName, T *initPtr); ... private: string name; T *ptr; }; 因为有指针成员的对象在进行拷贝和赋值操作

lujiandong1的专栏 2285

EffectiveC++详解:条款04-确定对象被使用前已被初始化

文章目录条款04-确定对象被使用前已被初始化1. 切勿混淆赋值和初始化2. 内置类型的赋值操作移到函数里,以避免重复的工作3. 成员初始化次序3.1 类的成员初始化次序3.2 不同编译单元内的 `non-local static` 对象的初始化次序4. 总结 @Author:CSU张扬 @Email:csuzhangyang@gmail.com or csuzhangyang@qq.com @...

神奇小海螺的博客 4199

条款04:确定对象被使用前已先被初始化

Effective C++条款04条款04:确定对象被使用前已先被初始化类构造函数的初始化和赋值区别non-local static对象讨论总结 条款04:确定对象被使用前已先被初始化 永远在使用对象之前先将它初始化。至于内置类型之外的任何其他东西,确保每一个构造函数都将对象的每一个成员初始化。 类构造函数的初始化和赋值区别 #include<iostream> #include<string> using namespace std; class ABEntry { public

weixin_38688399的博客 286
上一篇: C++-模板
下一篇: C++-从实例谈OOP、工厂模式与重构
MasterFT
博客等级 码龄20年 48粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值