C++中,对象作为函数参数的几种情况 | 您所在的位置:网站首页 › 拷贝构造函数使用什么作为参数初始化创建中的对象 › C++中,对象作为函数参数的几种情况 |
Passing Objects to Functions (对象作为函数参数)
Objects as Function Arguments (对象作为函数参数)
You can pass objects by value or by reference.
(对象作为函数参数,可以按值传递,也可以按引用传递)
(1) Objects as Function Return Value(对象作为函数参数) // Pass by value void print( Circle c ) { //作为函数参数 /* … */ } int main() { Circle myCircle(5.0); print( myCircle ); //作为函数参数 /* … */ }其中,先创建一个myCircle对象,然后print函数调用该对象。 (2) Objects Reference as Function Return Value(对象引用作为函数参数) void print( Circle& c ) { /* … */ } int main() { Circle myCircle(5.0); print( myCircle ); /* … */ }虽然在调用print函数时传入的参数是对象,但是在print函数定义中,使用了引用类型。 (3) Objects Pointer as Function Return Value(对象指针作为函数参数) // Pass by pointer void print( Circle* c ) { /* … */ } int main() { Circle myCircle(5.0); print( &myCircle ); /* … */ }在调用print函数时传入的参数是创建的对象的地址,在print函数定义中,对myCircle对象进行了解引用。 Objects as Function Return Value(对象作为函数返回值) // class Object { ... }; Object f ( /*函数形参*/ ){ // Do something return Object(args); } // main() { Object o = f ( /*实参*/ ); f( /*实参*/ ).memberFunction();创建了一个函数对象o = f(args),可以调用函数对象的属性值。object类型的函数定义中返回该对象传入的参数。 Objects Pointer as Function Return Value(对象指针作为函数返回值) // class Object { ... }; Object* f ( /*函数形参*/ ){ Object* o = new Object(args) // 这是“邪恶”的用法,不要这样做 // Do something return o; } // main() { Object* o = f ( /*实参*/ ); f( /*实参*/ )->memberFunction(); // 记得要delete o在该例子中,指针对象o在被创建时的生命周期为f(args)内部,调用完就会被擦除。 下面是允许的用法 // class Object { ... }; Object* f ( Object* p, /*其它形参*/ ){ // Do something return p; } // main() { Object* o = f ( /*实参*/ ); // 不应该delete o操作的是传入的对象指针,因此调用完后仍然能够返回传入的对象指针。 实践:尽可能用const修饰函数返回值类型和参数,除非你有特别的目的(使用移动语义等)。 const Object* f(const Object* p, /* 其它参数 */) { } Objects Reference as Function Return Value(对象引用作为函数返回值) // class Object { ... }; Object& f ( /*函数形参*/ ){ Object o {args}; // Do something return o; //这是邪恶的用法 }可行的用法1: // class Object { ... }; class X { Object o; Object f( /*实参*/ ){ // Do something return o; } }o的属性会被保留。 可行的用法2: // class Object { ... }; Object& f ( Object& p, /*其它形参*/ ){ // Do something return p; } // main() { auto& o = f ( /*实参*/ ); f( /*实参*/ ).memberFunction();和指针类似。 实践:用const修饰引用类型的函数返回值,除非你有特别目的(比如使用移动语义) const Object& f( /* args */) { } 一些高阶问题传值,传址,传指针,传引用都是骗初学者的。C++中有意义的概念是传值和传引用。 Differences between a pointer variable and a reference variableDifference between passing by reference vs. passing by value? |
CopyRight 2018-2019 实验室设备网 版权所有 |