当前位置: 首页 > wzjs >正文

深圳推荐企业网站制作维护宁波网络推广运营公司电话

深圳推荐企业网站制作维护,宁波网络推广运营公司电话,进不去wordpress,怎么用别人网站做模板在C中,区分赋值(assignment)和初始化(initialization)是一个非常重要的问题,因为它们在语义、调用时机和涉及的函数上有着本质的区别。 1. 定义 初始化(Initialization):…

在C++中,区分赋值(assignment)和初始化(initialization)是一个非常重要的问题,因为它们在语义、调用时机和涉及的函数上有着本质的区别。


1. 定义

  • 初始化(Initialization)

    • 指在对象创建时为其赋予初始值的过程。
    • 发生在对象生命周期的开始,通常由构造函数(包括默认构造函数、拷贝构造函数等)负责。
    • 语法上常见于声明时使用 = 或括号。
  • 赋值(Assignment)

    • 指在对象已经存在的情况下,修改其值的过程。
    • 发生在对象创建之后,通常由赋值运算符(operator=)负责。
    • 语法上表现为对已声明的对象使用 =

2. 主要区别

特性初始化(Initialization)赋值(Assignment)
时机对象创建时对象已存在后
涉及的函数构造函数(默认、拷贝、移动等)赋值运算符(operator=
资源管理直接构造,无需清理旧资源需要先清理旧资源,再赋值新值
语法示例T x = y;T x(y);x = y;
性能影响通常更高效(无需处理旧状态)可能涉及资源释放和重新分配

3. 如何区分:代码中的表现

在代码中,区分赋值和初始化主要看对象是否已经存在以及语法上下文

(1)初始化示例
Test t1;             // 默认初始化,调用默认构造函数
Test t2 = Test();    // 初始化,调用默认构造函数(可能优化为直接构造)
Test t3(t1);         // 初始化,调用拷贝构造函数
Test t4 = t1;        // 初始化,调用拷贝构造函数(不是赋值!)
Test t5 = getObj();  // 初始化,调用拷贝构造函数或移动构造函数
  • 这些都是在对象声明时进行的操作,触发构造函数。
  • 注意:Test t4 = t1; 看起来像赋值,但它是拷贝初始化,等价于 Test t4(t1);
(2)赋值示例
Test t1;        // 默认构造
t1 = Test();    // 赋值,调用赋值运算符
Test t2 = t1;   // 初始化(拷贝构造)
t2 = t1;        // 赋值,调用赋值运算符
t1 = getObj();  // 赋值,调用赋值运算符
  • 这些操作发生在对象已经构造之后,修改其状态,触发 operator=

4. 结合 Test 类分析

让我们用您提供的 Test 类来具体说明:

#include <iostream>
using namespace std;class Test {
public:Test() : m_num(new int(100)) {cout << "construct: my name is jerry" << endl;}Test(const Test& a) : m_num(new int(*a.m_num)) {cout << "copy construct: my name is tom" << endl;}~Test() {delete m_num;cout << "destruct Test class ..." << endl;}int* m_num;
};Test getObj() {Test t;return t;
}
(1)初始化场景
int main() {Test t = getObj();  // 初始化cout << "t.m_num: " << *t.m_num << endl;return 0;
}
  • 行为Test t = getObj(); 是初始化。
  • 调用:触发拷贝构造函数(或因 RVO 优化直接构造)。
  • 输出(无 RVO):
construct: my name is jerry
copy construct: my name is tom     // 返回时的临时对象
destruct Test class ...            // getObj() 中的 t
copy construct: my name is tom     // main 中的 t
destruct Test class ...            // 临时对象
t.m_num: 100
destruct Test class ...            // main 中的 t  
  • 原因t 在声明时被构造,没有先存在再修改的过程。
(2)赋值场景
int main() {Test t;         // 默认构造t = getObj();   // 赋值cout << "t.m_num: " << *t.m_num << endl;return 0;
}
  • 行为
    • Test t; 是初始化,调用默认构造函数。
    • t = getObj(); 是赋值,调用默认赋值运算符(浅拷贝)。
  • 输出(假设未定义 operator=):
    construct: my name is jerry  // Test t
    construct: my name is jerry  // getObj() 中的 t
    copy construct: my name is tom  // 返回时的临时对象
    destruct Test class ...      // getObj() 中的 t 析构
    destruct Test class ...      // 临时对象析构
    // 此时 t.m_num 是野指针,访问未定义行为
    
  • 问题:默认赋值运算符执行浅拷贝,导致 t.m_num 指向已释放的内存。

如果定义赋值运算符:

Test& operator=(const Test& a) {if (this != &a) {delete m_num;m_num = new int(*a.m_num);}return *this;
}

输出变为:

construct: my name is jerry  // Test t
construct: my name is jerry  // getObj() 中的 t
copy construct: my name is tom  // 返回时的临时对象
destruct Test class ...      // getObj() 中的 t 析构
destruct Test class ...      // 临时对象析构
t.m_num: 100
destruct Test class ...      // t 析构

5. 区分的关键点

  • 语法位置
    • 声明时带 = 或括号(如 T x = y;):初始化。
    • 已声明对象后用 =(如 x = y;):赋值。
  • 对象状态
    • 初始化:对象尚未存在,直接构造。
    • 赋值:对象已有状态,需要清理旧资源。
  • 调用的函数
    • 初始化:构造函数(Test()Test(const Test&) 等)。
    • 赋值:operator=

6. 常见误区

  • T x = y; 不是赋值
    • 很多人看到 = 就认为是赋值,但这是拷贝初始化,调用拷贝构造函数。
    • 只有在 x 已存在时,x = y; 才是赋值。
  • 编译器优化
    • RVO 或拷贝省略可能让初始化看起来没有调用拷贝构造函数,但逻辑上仍是初始化。

7. 总结

  • 初始化:对象创建时,使用构造函数(Test t = getObj();)。
  • 赋值:对象存在后修改,使用赋值运算符(t = getObj();)。
  • 在您的原始代码中,只有初始化(Test t = getObj();),所以不需要赋值运算符也能正常运行。
http://www.dtcms.com/wzjs/38241.html

相关文章:

  • 大连网站设计策划竞价托管哪家专业
  • 合肥建网站要多少钱网店推广网站
  • php第一季网站开发实例教程今日nba数据帝
  • wordpress邮箱设置重庆 seo
  • 网站页尾版权磁力狗
  • 全球做的比较好的网站常用的营销方法和手段
  • 企业网站设计需求文档个人网站制作模板
  • 温州网站设计案例郑州seo线下培训
  • 网站书店架构书怎么做百度seo刷排名工具
  • 什么网站做兼职最好快速seo关键词优化技巧
  • 做传销一般是不是有网站晋城seo
  • 如何在微信内做网站微信营销的优势
  • 十堰seo优化报价谷歌seo和百度seo区别
  • 瓜子网网站建设策划书百度搜索引擎优化相关性评价
  • 惠州网站建设(推荐乐云践新)百度广告投放价格
  • 做网站什么最赚钱吗怎么开发一个网站
  • 网站上设置返回首页的超链接咋做的营销案例100例小故事及感悟
  • 站长之家点击进入百度一下打开
  • 黄页引流推广链接昆明seo关键词排名
  • 网站空间升级通知百度搜索量统计
  • 做个网站跳转链接怎么做aso排名优化知识
  • 前端只是做网站吗无屏蔽搜索引擎
  • 政府网站建设考试题目上海最新发布
  • 重庆工厂网站建设搜索引擎优化岗位
  • 怎么做网站教程+用的工具怎么免费搭建自己的网站
  • 自建站和独立站黑帽seo培训大神
  • 郑州市住房和城乡建设委员会网站seo接单平台有哪些
  • 重庆网站建设只选承越搜索引擎费用
  • 网站建设代理平台百度推广怎么优化排名
  • 广州网站建设oem百度推广400电话