我想确保我理解按值传递和正确传递.特别是,我正在查看++对象的增量运算符的前缀/后缀版本.
我们假设我们有以下课程X:
class X{
private:
int i;
public:
X(){i=0;}
X& operator ++ (){ ++i; return *this; } //prefix increment
X operator ++ (int unused){ //postfix increment
X ret(*this);
i++;
return ret;
}
operator int(){ return i; } //int cast
};
Run Code Online (Sandbox Code Playgroud)
首先,我是否正确实现了前缀/后缀增量运算符?
第二,与前缀运算符相比,后缀运算符的内存效率如何?具体来说,X当使用每个版本的运算符时,会创建多少个对象副本?
准确地解释通过引用返回和按值返回会发生什么可能有助于我理解.
编辑:例如,使用以下代码...
X a;
X b=a++;
Run Code Online (Sandbox Code Playgroud)
... a和b现在是别名吗?
大家好我今天偶然发现了这段代码,我对于究竟发生了什么以及更具体的顺序感到困惑:
代码:
#include <iostream>
bool foo(double & m)
{
m = 1.0;
return true;
}
int main()
{
double test = 0.0;
std::cout << "Value of test is : \t" << test << "\tReturn value of function is : " << foo(test) << "\tValue of test : " << test << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Value of test is : 1 Return value of function is : 1 Value of test : 0
Run Code Online (Sandbox Code Playgroud)
看到这一点,我会假设在调用函数之前打印出最正确的参数.那么这是对的评价吗?在调试期间,虽然似乎在输出之前调用该函数,这是我所期望的.我正在使用Win7和MSVS 2010.任何帮助表示赞赏!
我读了几个关于未定义行为和序列点的非常好的答案(例如未定义的行为和序列点),我明白了
int i = 1;
a = i + i++; //this is undefined behaviour
Run Code Online (Sandbox Code Playgroud)
根据C++标准,是未定义的代码.但是,未定义的行为背后的深层原因是什么?是否足以使其成为未指明的行为?正常的论点是,通过几个序列点,C++编译器可以更好地针对不同的体系结构进行优化,但是不会让它未指定允许这些优化吗?在
a = foo(bar(1), bar(2)); //this is unspecified behaviour
Run Code Online (Sandbox Code Playgroud)
编译器也可以优化,并且它不是未定义的行为.在第一个例子中,似乎很清楚,a是2或3,所以语义似乎对我来说很清楚.我希望有一个推理,为什么有些东西是未指定的,有些是未定义的.