g*********s 发帖数: 1782 | 1 class A {
public:
A() {}
~A() {}
...
};
std::map M;
std::map::iterator it = M.find("hello");
if (it==M.end()) M["hello"]=A();
合法但风格不好,还是很正常的用法?看着别扭。 |
t****t 发帖数: 6806 | 2 很奇怪的写法,看上去是要找"hello",如果没有就添一个,那直接写
M["hello"];
就行了。要写得清楚一点就可以写
M.insert(std::make_pair(std::string("hello"), A()));
不过我觉得还不如上面的清楚呢。。。
【在 g*********s 的大作中提到】 : class A { : public: : A() {} : ~A() {} : ... : }; : std::map M; : std::map::iterator it = M.find("hello"); : if (it==M.end()) M["hello"]=A(); : 合法但风格不好,还是很正常的用法?看着别扭。
|
c*****z 发帖数: 182 | 3 M["hello"] 返回值事什么类型的啊
【在 t****t 的大作中提到】 : 很奇怪的写法,看上去是要找"hello",如果没有就添一个,那直接写 : M["hello"]; : 就行了。要写得清楚一点就可以写 : M.insert(std::make_pair(std::string("hello"), A())); : 不过我觉得还不如上面的清楚呢。。。
|
g*********s 发帖数: 1782 | 4 Oh,确实是要做find_or_create的。有个findonly tag。按你的意见,这个?
it = M.find("hello");
if (it==M.end()) {
if (findonly) return NULL;
// findonly mode. return NULL if no hit
else {
return &M["hello"];
// create mode. create an entry if no hit.
}
}
或者这样?
if (findonly) {
it = M.find(hello);
return (it!=M.end()?&M["hello"]:NULL);
} else return &M["hello"];
更简洁写法:return (!findonly||it!=M.end()?&M["hello"]:NULL); 不过这个有点费
解了。
【在 t****t 的大作中提到】 : 很奇怪的写法,看上去是要找"hello",如果没有就添一个,那直接写 : M["hello"]; : 就行了。要写得清楚一点就可以写 : M.insert(std::make_pair(std::string("hello"), A())); : 不过我觉得还不如上面的清楚呢。。。
|
g*********s 发帖数: 1782 | 5 data_type& operator [](const key_type& k);
【在 c*****z 的大作中提到】 : M["hello"] 返回值事什么类型的啊
|
g*********s 发帖数: 1782 | 6 原来那个code费解就是因为A()按理是没有类型返回的,却做了右值。
【在 g*********s 的大作中提到】 : data_type& operator [](const key_type& k);
|
t****t 发帖数: 6806 | 7 kidding?
A() returns type A, of course.
【在 g*********s 的大作中提到】 : 原来那个code费解就是因为A()按理是没有类型返回的,却做了右值。
|
g*********s 发帖数: 1782 | 8 A or A&?
具体到这个例子,M["hello"]=A(); 展开的话是M先创建一个"hello"为key的节点,A()
创建一个临时匿名对象A,再通过赋值操作符函数,内容复制到M["hello"]里去?之后
临时匿名对象消失?
我印象中很多参考书都说constructor没有返回类型。刚才google了一下这样的说法不
少。
现在看来,精确的说法是constructor不能被程序员显式指定返回类型。
【在 t****t 的大作中提到】 : kidding? : A() returns type A, of course.
|
P********e 发帖数: 2610 | 9 最后一句话,是语法啊,ctor本来就没有return type
A()不算临时变量了,因为就好象M["hello"]是一个variable了, 跟string s =
string("");是一样的
()
【在 g*********s 的大作中提到】 : A or A&? : 具体到这个例子,M["hello"]=A(); 展开的话是M先创建一个"hello"为key的节点,A() : 创建一个临时匿名对象A,再通过赋值操作符函数,内容复制到M["hello"]里去?之后 : 临时匿名对象消失? : 我印象中很多参考书都说constructor没有返回类型。刚才google了一下这样的说法不 : 少。 : 现在看来,精确的说法是constructor不能被程序员显式指定返回类型。
|
t****t 发帖数: 6806 | 10 of course A() is a temp object.
more precisely, A() returns a temp object. objects returned from function (not reference to object) are all temporary.
【在 P********e 的大作中提到】 : 最后一句话,是语法啊,ctor本来就没有return type : A()不算临时变量了,因为就好象M["hello"]是一个variable了, 跟string s = : string("");是一样的 : : ()
|
t****t 发帖数: 6806 | 11 你前面说的都对(指M["hello"]=A();的操作), 除了匿名对象这个说法不太准确, 因为C
++里用的名称是临时对象.
后面, constructor没有返回类型是对的, 但是A()返回类型是A(not A&)也是对的.
因为A()并不是"调用"constructor. constructor通常不能显式调用, 除了在
initializer list里以外. A()是一个表达式, 它的返回类型刚好是A, 实际上是
Explicit type conversion (functional notation).
()
【在 g*********s 的大作中提到】 : A or A&? : 具体到这个例子,M["hello"]=A(); 展开的话是M先创建一个"hello"为key的节点,A() : 创建一个临时匿名对象A,再通过赋值操作符函数,内容复制到M["hello"]里去?之后 : 临时匿名对象消失? : 我印象中很多参考书都说constructor没有返回类型。刚才google了一下这样的说法不 : 少。 : 现在看来,精确的说法是constructor不能被程序员显式指定返回类型。
|