我对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 ++内联关键字的结果,这与此事完全无关。
答案 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;
}