如果对一个对象连续调用成员方法,每次都会改变对象本身,成员方法需要返回引用
#include<iostream> using namespace std; class Test { public: Test(int a, int b) { this->a = a; this->b = b; } void printT() { cout << "a = " << this->a << " " << "b = " << this->b << endl; } int getA() { return this->a; } int getB() { return this->b; } //成员方法 Test TestAdd( Test &another) { Test temp(this->a+another.a,this->b+another.b); return temp; } //+= 方法 Test &TestAdd2(Test &another) { this->a += another.a; this->b += another.b; return *this;//如果返回一个对象的本身,在成员方法中,用*this返回 } private: int a; int b; //int temp; }; //1 在全局提供,两个test相加的函数 /* Test TestAdd(Test &t1, Test&t2) { Test temp(t1.getA() + t2.getA(), t1.getB() + t2.getB()); return temp; } */ int main() { Test t1(10, 20); Test t2(100, 200); Test t3 = t1.TestAdd(t2); t3.printT(); system("pause"); return 0; }导入: 加入在C++中经常性的访问我的成员变量,或者成员函数,于是出现一种类型可以解决这个问题(避免出栈和压栈操作,节省开支);
#include<iostream> #include<cmath> using namespace std; class Point { public: Point(int x, int y) { this->x = x; this->y = y; } int getX() { return this->x; } int getY() { return this->y; } private: int x; int y; }; double PointDistance(Point &p1, Point &p2) {`在这里插入代码片` double dis; int dd_x = p1.getX() - p2.getX(); int dd_y = p1.getY() - p2.getY(); dis = sqrt(dd_x*dd_x + dd_x*dd_y); return dis; } int main() { Point p1(1, 2); Point p2(2, 3); cout << PointDistance(p1, p2) << endl; system("pause"); return 0; }可以修改成已下的代码: 因为全局函数经常或者多次访问类中的成员函数或者私有变量,这样会经常进行进栈和出栈,
#include<iostream> #include<cmath> using namespace std; class Point { public: //声明全局函数PointDistance是我Point类中的一个友元函数 friend double PointDistance(Point &p1, Point &p2); Point(int x, int y) { this->x = x; this->y = y; } int getX() { return this->x; } int getY() { return this->y; } private: int x; int y; }; double PointDistance(Point &p1, Point &p2) { double dis; //int dd_x = p1.getX() - p2.getX(); //int dd_y = p1.getY() - p2.getY(); //dis = sqrt(dd_x*dd_x + dd_x*dd_y); int dd_x = p1.x - p2.x; int dd_y = p1.y - p2.y; dis = sqrt(dd_x*dd_x + dd_x*dd_y); return dis; } int main() { Point p1(1, 2); Point p2(2, 3); cout << PointDistance(p1, p2) << endl; system("pause"); return 0; } #include<iostream> #include<cmath> using namespace std; class Point; class PointManager { public: double PointDistance(Point &p1, Point &p2); }; class Point { public: //声明全局函数PointDistance是我Point类中的一个友元函数 friend double PointDistance(Point &p1, Point &p2); friend double PointManager::PointDistance(Point &p1, Point &p2); Point(int x, int y) { this->x = x; this->y = y; } int getX() { return this->x; } int getY() { return this->y; } private: int x; int y; }; double PointDistance(Point &p1, Point &p2) { double dis; //int dd_x = p1.getX() - p2.getX(); //int dd_y = p1.getY() - p2.getY(); //dis = sqrt(dd_x*dd_x + dd_x*dd_y); int dd_x = p1.x - p2.x; int dd_y = p1.y - p2.y; dis = sqrt(dd_x*dd_x + dd_x*dd_y); return dis; } double PointManager::PointDistance(Point &p1, Point &p2) { double dis; //int dd_x = p1.getX() - p2.getX(); //int dd_y = p1.getY() - p2.getY(); //dis = sqrt(dd_x*dd_x + dd_x*dd_y); int dd_x = p1.x - p2.x; int dd_y = p1.y - p2.y; dis = sqrt(dd_x*dd_x + dd_x*dd_y); return dis; } int main() { Point p1(1, 2); Point p2(2, 3); cout << PointDistance(p1, p2) << endl; PointManager pm; pm.PointDistance(p1, p2); cout << pm.PointDistance(p1, p2) << endl; system("pause"); return 0; }把这个拆开来写 double PointManager::PointDistance(Point &p1, Point &p2) { double dis; //int dd_x = p1.getX() - p2.getX(); //int dd_y = p1.getY() - p2.getY(); //dis = sqrt(dd_xdd_x + dd_xdd_y);
int dd_x = p1.x - p2.x; int dd_y = p1.y - p2.y; dis = sqrt(dd_x*dd_x + dd_x*dd_y); return dis;}
异类之间有友元
