【发布时间】:2013-08-23 05:11:04
【问题描述】:
我一定对 C++11 有一个根本性的误解。我的教授告诉我,除了通过引用或指针之外,不可能将非原始类型传递给函数。但是,以下代码可以正常工作
#include <iostream>
using namespace std;
class MyClass
{
public:
int field1;
};
void print_string(string s) {
cout << s << endl;
}
void print_myclass(MyClass c) {
cout << c.field1 << endl;
}
int main(int argc, char *argv[])
{
string mystr("this is my string");
print_string(mystr); // works
MyClass m;
m.field1=9;
print_myclass(m);
return 0;
}
运行程序产生以下输出
this is my string
9
RUN SUCCESSFUL (total time: 67ms)
我在 Win7 上使用 MinGW/g++
为什么会这样?我以为非原始类型不能按值传递?!
【问题讨论】:
-
你的教授错了,如果他是这么说的话。更有可能的是,他说这是不可取的。
-
@EJP 如果他说这是不可取的,作为一个笼统的陈述,那么他也是错的 ;-) 虽然这是“过时的或没有经过深思熟虑的性能建议”的错误,而不是“不懂语言基础”有点错误,这稍微好一点。
-
好的。谢谢!我想这是不可取的,因为它会导致每个参数对象的另一个副本?
-
@JaredLindsey,是的,它会调用类上的复制构造函数,除非它已被显式删除或设为私有。然后您的代码无法编译。如果复制构造函数已被覆盖,则传递的参数必须符合您明确定义的复制构造函数的定义。
-
编程教授不一定是优秀的程序员。被警告!
标签: c++ class parameter-passing pass-by-value