拷贝初始化与直接初始化的区别

本文详细探讨了拷贝初始化(copy-initialization)和直接初始化(direct-initialization)的区别。拷贝初始化主要涉及隐式转换,而直接初始化则更多依赖构造函数的参数类型。在拷贝初始化中,如果构造函数声明为`explicit`,则不能用于`= `操作。同时,拷贝初始化允许构造内容通过隐式或显式转换匹配构造函数参数类型。直接初始化则可以直接通过构造函数参数类型或其接受的转换类型进行初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

copy-initialization vs direct-initialization

  • LINDA
  • 2018/8/31
copy-initialization

指用一个对象初始化另外一个对象:

在下面这6种情况下发生:

T object = other;     //(1) 当一个非引用类型T的具名变量通过 '=' 被一个表达式初始化时 
T object = {
    other};   //(2) 当一个纯量类型T的具名变量通过 '=' 被一个括号表达式初始化时

f(other)              //(3) 当通过值传递给函数的参数时

return other;         //(4) 当函数返回一个值时

throw object;

catch(T object)       //(5) 当throw/catch 一个表达式的值时

T array[N] = {
    other}; //(6) 使用聚合初始化,初始化每个元素

注意:

  1. copy-initialization 权限少于direct-initializationexplicit构造函数不能作为转换构造函数converting constructors,并且不能用于copy-initialization

也就是说**explicit修饰的构造函数都不能用于copy-initialization**。如,智能指针就把它们的构造函数声明为explicit ,所以,智能指针智能使用 direct-initialization.

class Test {
   
public:
    explicit Test(const Test&) {
   
        // ...
    }
    // ...
};

Test T;
Test T1(T);   // Ok
Test T2 = T1; // Error!

shared_ptr<int> sp = new int(8); // Error!
shared_ptr<int> sp(new int(8));  // OK

https://en.cppreference.com/w/cpp/language/copy_initialization

  1. copy-initialization不允许隐式转换,必须直接由初始化器(先类型转换等)产生T类型。例如:
struct S {
   S(std::string) {
   } }; // 允许隐式转换
S s("abc");   // OK, direct-initialization,const char[4]隐式转换为string
S s = "abc";  // Error, copy-initialization,无法转换
S s 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值