effective c++:宁以pass-by-reference-to-const替代pass-by-value
2015-10-31 00:42
489 查看
class People { public: People() { cout << " construct fun " << endl; } People(const People& i) :a(i.a) { cout << " copy construct " << endl; } People &operator=(const People& p) { a = p.a; cout << " operator = " << endl; return *this; } ~People() { cout << " destory " << endl; } private: int a; }; People test(People a) { cout << " do sth " << endl; return a; } int main() { People a,b; a = test(b); }
果然如果pass-by-value会导致额外的拷贝构造和析构
而且返回如果是一个object,也需要调用拷贝构造函数和析构函数
class People { public: virtual void print()const { cout << " people " << endl; } virtual ~People(){} }; class Man : public People { public: void print()const { cout << " Man " << endl; } ~Man(){} }; void test1(People p) { p.print(); } void test2(const People * p) { p -> print(); } int main() { People *pa = new People(); People a; Man b; People *pb = new Man(); test1(a); test1(b); //虽然传递的是一个Man类型的参数 //但是因为函数参数是People类型的 //所以Man类型的特性无法显示出来 //导致也只能输出People test2(pa); test2(pb); }
对于内置类型,STL迭代器和函数对象,设置成pass-by-value更好(不过后两者还需要视情况而定)
即使是小型对象有并不昂贵的copy构造函数,效率方面还是有争议。某些编译器对于“内置类型”和“用户自定义类型”的态度截然不同,某些编译器拒绝把只有一个double组成的对象放到缓存器中,却很乐意在一个正规基础上对光秃秃的double那么做
相关文章推荐
- JavaScript之自定义类型
- JavaScript传递变量: 值传递?引用传递?
- JSP与JS交互问题 值传递
- Java中的值传递和引用传递实例介绍
- C#中的值传递和引用传递详细解析
- python中的对象拷贝示例 python引用传递
- 漫谈C指针:一个指针应用实例
- 漫谈C指针:参数的值传递
- 漫谈C指针:参数传递的三道题目
- java参数传递(值传递还是引用传递)
- 引用传递和值传递,克隆
- 关于Java值传递和引用传递的三点结论
- 关于函数值传递
- 值传递大练习
- Java 按值传递还是按引用传递详细解说
- 有关java中的参数调用的问题
- java中值传递和引用传递
- 关于值传递和引用传递的误区
- 如何解决无法有多个返回值的问题
- c++ 工具