由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 这段code有啥问题?
相关主题
请问以下代码有什么错误?*(&b1)=b编译不过,b1=b可以,区别是?
问个题。C++ 中 myobject * a =new myobject[n] 的问题
C#复制栈是反序的?问个问题--可能比较老
再问两个C++问题c++ exception
c++ questionc++问题,请高人指点迷津,c++ faq lite的一个例子
c++ pointers are iterators, why?一道c++的考古题
how to write a function take iterators as parameters?包含指针的类和vector的问题
菜鸟请教smart pointer回答C++的弱问题
相关话题的讨论汇总
话题: hello话题: findonly话题: null话题: return话题: string
进入Programming版参与讨论
1 (共1页)
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不能被程序员显式指定返回类型。

1 (共1页)
进入Programming版参与讨论
相关主题
回答C++的弱问题c++ question
[合集] C++的弱问题c++ pointers are iterators, why?
急问:compile and build dependencyhow to write a function take iterators as parameters?
find bugs of c++ codes菜鸟请教smart pointer
请问以下代码有什么错误?*(&b1)=b编译不过,b1=b可以,区别是?
问个题。C++ 中 myobject * a =new myobject[n] 的问题
C#复制栈是反序的?问个问题--可能比较老
再问两个C++问题c++ exception
相关话题的讨论汇总
话题: hello话题: findonly话题: null话题: return话题: string