2013-03-15 98 views
0

有人可以,请帮助我理解的语法如下:“x(y)= z(w)”在C++中的含义是什么?

aaa<bbb> object_name; 
func(object_name, object_name2); 
ccc<ddd>(object_name) = func2(arg1, arg2); 

据我所知,在我们第一次宣布aaa<bbb>类的新对象。然后我们使用这个对象和另一个来调用一个函数,这可能会改变object_name的值。我有麻烦去理解第三行。特别是=标志左侧的施工。为什么object_name在括号内?对我来说,看起来我们称之为功能。但是,我们可以在=标志的左侧和右侧调用一个函数吗?

+0

@Carl Norum,但是然后'value1 = value2'构造呢? – Roman 2013-03-15 14:34:11

+1

在C++教科书中查找左值和引用。 – WhozCraig 2013-03-15 14:35:42

回答

5

一个函数调用可以返回一个左值,这是一种明智地出现在赋值表达式左侧的类型。在这种情况下左值的通常类别是参考;例如vector<T>::front返回T &类型的参考:

std::vector<int> v{0, 1, 2, 3}; 
v.front() = 99; 
// v is now {99, 1, 2, 3} 

高级使用仅:它也可以用于一个函数与一个重载赋值操作返回一个对象类型的prvalue使得赋值表达式具有一些适当的效果;但是,除了少数情况下,标准库不使用此功能,例如ostream_iterator

+0

我几乎理解了这个概念。我唯一的问题是概念或参考。我将它理解为变量的“内存地址”。但是,据我所知,如果'a'是变量的地址,我们可以使用'*'来改变变量的值。例如'* a = 5'。那么,为什么我们在这种情况下不使用'*'? '*(v.front())= 99;' – Roman 2013-03-15 14:53:34

+0

@Roman * *操作符用于*指针*,它封装了一个对象的内存地址,可以被中介(使用'*'一元运算符)以获得该对象的左值。引用在引用的整个生命周期中表现为它们引用的对象的左值,而不需要间接引用。 – ecatmur 2013-03-15 15:01:20

0

我认为第三个的左边用参数* object_name *实例化一个模板函数。有可能将值分配给func2()可能是由于运算符=的某些重载造成的。

0

ccc<ddd>可能是一个函数(函数模板的专门化)。它可以返回一个引用,在这种情况下,引用的对象将被修改。或者它可能会返回一个“代理”对象,其中有一个operator=,它将执行一些有用的操作。

不太可能,ccc<ddd>可能是类类型(类模板的专业化)。但是为了表示任何有用的东西,它的operator=必须有一些副作用,而不是暂时的ccc<ddd>对象,这很奇怪。

1

可能返回的值是一个l值,您可以为其确定一个值。它可能是这样的:

int x = 5; 

template <typename T> 
int& foo() { return x; } 

void test() 
{ 
    foo<long>() = 10; 
} 
+0

我对我们的例子有几点疑问。你为什么使用模板?对我来说,它看起来像你在'foo'函数之前“声明”类型'T',但后来你不使用这种类型?那么,宣布它的理由是什么?其次,“foo”函数返回什么?显然它不是x,否则我们会有'5 = 10'。它是否返回变量'x'的地址。如果是,为什么我们不用'*'来改变这个地址的值:'* foo ()= 10;'? – Roman 2013-03-15 14:48:25

+0

原因只是为了提供与您提供的相似的示例。当然在你的例子中,模板将以某种方式使用,但由于没有实现,我不能发明。它返回一个引用,该引用是该变量的地址,但它意味着以不同的方式使用。实施明智,它是一个指针,但它有不同的限制,http://en.wikipedia.org/wiki/Reference_(C%2B%2B) – Jack 2013-03-15 14:50:52

相关问题