区别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;
}