C ++创建一个对象并在同一行中使用它

时间:2013-12-22 13:10:40

标签: c++ constructor

我对C ++很新,并且想知道这个:

假设我需要创建类X的对象x并调用它返回的函数foo() Y类型的对象y。在获得y之后我不再需要x。

目前,我这样做:(假设a和b是X的构造函数的参数)

X x(a,b);
Y y = x.foo();

但是,对于可读性问题,我想在一行中完成这些工作。另外,名字x在四处都是没有意义的。

我的本​​机编程语言是Java,我会做这样的事情:

Y y = (new X(a,b)).foo();

我为提出这样一个基本问题而道歉,但我的搜索没有任何结果,因为他们大多数都返回了关于C ++内联关键字的结果,这与此事完全无关。

3 个答案:

答案 0 :(得分:2)

C ++默认使用堆栈分配。这意味着您不必使用new,因为变量不是指针。要解决您的问题,请仅删除new

Y y = X( a, b ).foo();

X( a , b )是对X的构造函数的调用,.foo()调用ctor返回的rvalue的成员函数foo

请注意,C ++变量的生命周期与变量的范围相关联。这意味着变量在声明时初始化,并在程序超出其范围时被销毁 这意味着(在您的代码中重新定义)构造函数调用X(a , b )创建的右值的范围仅为该句子(Y y = X( a, b ).foo();),因此该值在该句子结束后被销毁。这就是为什么通常以这种方式呼叫ctors是一种不好的做法。

答案 1 :(得分:1)

编译例如:

#include <iostream>

struct Person {

    Person getRelatedPerson () {
        return Person();
    }

    void printAge () {
        std::cout << 5 << std::endl;
    }
};

int main (int argc, char *argv[]) {
    Person person;

    person.getRelatedPerson().printAge();
    return 0;
}

答案 2 :(得分:0)

基于这里的代码示例,我很好奇,然后开始玩了。

#include <iostream>

struct Person
{
    int age = 5;

    Person()
    {
    };

    Person(int newage) : age(newage)
    {
    };

    Person getNewPerson()
    {
        return Person();
    }

    void printAge()
    {
        std::cout << age << std::endl;
    }
};

int main(int argc, char *argv[])
{
    Person person;
    person.getNewPerson().printAge();       // 5

    Person p2 = Person(6).getNewPerson();
    p2.printAge();                          // 5

    Person p3 = Person(6);
    p3.printAge();                          // 6

    Person(9).getNewPerson().printAge();    // 5

    Person(9).printAge();                   // 9

    return 0;
}