简单嗦一下{}初始化和()初始化的区别

区别1:

当你自定义一个MM类,MM类有两个成员属性

你想写一个MM类的数组,你应该怎么初始化?

#include <iostream>
using namespace std;

class MM
{   
    public:
    int m_a;
    int m_b;

    MM(int a,int b){m_a=a;m_b=b;}
};

int main() 
{
    MM m1[2]={{1,2},{4,3}};
    // MM m2[2]={(1,2),(4,3)};   //  会报错:No viable conversion from 'int' to 'MM'  即没有从int到MM的转换
    cout<<m1[0].m_a<<m1[0].m_b<<" "<<m1[1].m_a<<m1[1].m_b<<endl; //输出12 43
}

只能用{}初始化。

No viable conversion from 'int' to 'MM'的意思是没有从int到MM的转换

于是乎,第一个区别就来了。

在上面的代码中,编译器认为  ()表示对数字(1,2)(3,4)进行转换,转换为MM类型   但是编译器是不懂

但是编译器认为 {}表示对m1数组的两个元素分别初始化,调用有参构造函数。

再看下面的例子:

#include <iostream>
using namespace std;

class MM
{   
    public:
    int m_a;
    int m_b;
    MM(){cout<<"调用默认构造函数"<<endl;}
};

int main() 
{

    MM func1();  //这是一个函数名为func1,返回值类型为MM的函数声明;
    MM func2{};  //这是一个MM类型的对象,并且调用了默认构造函数
}

也就是当你的自定义类型有多个成员属性,当你想建立一个该自定义类型的数组时,你要用{}来初始化。

区别2:

{}不能进行窄化转换, ()可以

窄化转换是指将一种类型的值转换为另一种类型的值时,可能会丢失信息或精度的情况。例如,将浮点数转换为整数时,小数部分将被截断。

#include <iostream>
using namespace std;



int main() 
{
    // int x{3.14}; // 编译错误,因为浮点数不能窄化转换为整数
    int y(3.14); // y的值为3,因为浮点数被截断
    cout<<y<<endl;
    // int m{9876543210};// 9876543210超出int类型的表示范围了   编译错误,因为会窄化
    int n(9876543210);// 
    cout<<n<<endl;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值