括号与花括号

时间:2017-02-27 06:59:36

标签: c++ constructor

#include<iostream>
using namespace std;
class test
{
    public:
    int a,b;

    test()
    {
        cout<<"default construictor";

    }
    test(int x,int y):a(x),b(y){

        cout<<"parmetrized constructor";
    }

};
int main()
{

    test t;
    cout<<t.a;
     //t=(2,3);->gives error
     t={2,3}; //calls paramterized constructor
     cout<<t.a;
}

输出: - 默认construictor4196576parmetrized constructor2

为什么在上面的例子中,参数化构造函数(即使已经调用了默认构造函数。)在{}而不是在()

的情况下被调用。

2 个答案:

答案 0 :(得分:5)

我添加了一些额外的代码来显示实际发生的情况。

#include<iostream>
using namespace std;

class test
{
    public:
    int a,b;

    test()
    {
        cout << "default constructor" << endl;
    }

    ~test()
    {
        cout << "destructor" << endl;
    }

    test(int x,int y):a(x),b(y)
    {
        cout << "parameterized constructor" << endl;
    }

    test& operator=(const test& rhs)
    {
        a = rhs.a;
        b = rhs.b;
        cout << "assignment operator" << endl;
        return *this;
    }

};

int main()
{

    test t;
    cout << t.a << endl;
     //t=(2,3);->gives error
     t={2,3}; //calls parameterized constructor
     cout << t.a << endl;
}

输出:

default constructor
4197760
parameterized constructor
assignment operator
destructor
2
destructor

所以语句t={2,3};实际上是使用参数化构造函数构造一个新的test对象,调用赋值运算符将t设置为等于新的临时test } object,然后销毁临时test对象。它等同于t=test(2,3)语句。

答案 1 :(得分:4)

使用

test t(2,3);

而不是

test t;
t=(2,3);

因为在对象声明之后使用了括号。