赞
踩
实际参数 复制到 形式参数(对形式参数进行初始化)。与实际参数无关。因此在class 传递时,值传递方式,会调用 复制构造函数 进行新(临时)对象的初始化(产生新副本),不会修改原来的 class。
指针参数对应“实际参数”的地址表达式。因此在class 传递时,不会调用复制构造函数,直接操作原来的class。
引用是对“实际参数”的绑定,执行函数体时,对形参操作等同与对实参对象进行操作。引用参数不想指针通过间址访问实参对象,特别适合“大对象”参数的高效操作。这样的底层原理就要求,引用传递的必须是对象名;你可以想想,如果传递一个常数,这个就无法引用,常数需要用一个匿名对象进行保存,匿名对象无法引用传递。
note: 可以用const 进行限定引用(可限定传递常数和表达式),避免调用函数对实参的修改。例如const int &k
。对于常数传递,会产生一个匿名对象保存这个常数,操作完毕后撤销匿名对象,这样的效果和值传递的情况类似。
note: 函数返回引用时,可以支持左值。
#include<iostream> #include<string> using namespace std; //对象数组 //对象数组中的每一个成员创建时都会使用构造函数 //可以创建一维以及二维对象数组 //Square s[5];Square s[5][5]; //创建对象数组的同时,初始化对象数组的方式 //Square s[3]={Square(1),Square(2),Square(3)} /// Part 1 声明类 class Square { public: Square(int len=10); Square(const Square&S); void PrintSquare(); void set(int len); ~Square(); private: int length; }; // 这个``:length(len)`` 是初始化赋值操作。 Square::Square(int len):length(len) { cout << "使用构造函数" << endl; } Square::~Square() { cout << "使用了析构函数" << endl; } void Square::PrintSquare() { cout << "面积:" << length * length*length << endl;; } void Square::set(int len) { length = len; } Square::Square( const Square&S) { cout << "调用了复制构造函数" << endl; } /// Part 2 //操作 void change1(Square s) { s.set(0); cout << "值传递" << endl; } void change2(Square*s) { s->set(0); cout << "使用了指针传递" << endl; } void change3(Square&s) { s.set(0); cout << "使用了引用" << endl; } /// Part 3 int main() { Square S[5] = {Square(1),Square(2),Square(3),Square(4),Square(5)}; change1(S[0]); change2(&S[1]); Square&s = S[2]; change3(s); S[0].PrintSquare(); S[1].PrintSquare(); S[2].PrintSquare(); system("pause"); }
可以看到只有
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。