做房地产咨询网站怎么赢利,专注东莞微信网站设计,泉州网站建设公司首选公司哪家好,海门建网站公司对象型参数和返回值 1.对象型类型作为函数的参数2.对象型参数作为函数的返回值 1.对象型类型作为函数的参数 使用对象类型作为函数的参数或者返回值#xff0c;可能会产生一些不必要的中间对象 例子#xff1a;
// 使用对象类型作为函数的参数
void test1(Car car) {}完整代… 对象型参数和返回值 1.对象型类型作为函数的参数2.对象型参数作为函数的返回值 1.对象型类型作为函数的参数 使用对象类型作为函数的参数或者返回值可能会产生一些不必要的中间对象 例子
// 使用对象类型作为函数的参数
void test1(Car car) {}完整代码如下
class Car {
public:Car() {cout Car() - this endl;}Car(const Car car) {cout Car(const Car ) - this endl;}~Car() {cout ~Car() - this endl;}void run() {cout run() endl;}
};// 使用对象类型作为函数的参数
void test1(Car car) {}Car test2() {return Car();
}int main() {Car car1; // Car()test1(car1);getchar();return 0;
}输出 可以看到调用了构造函数析构函数 另外还可以看到程序还调用了一个拷贝调用函数 也就是car1对象传给test()函数的时候发现它调用了拷贝调用函数也就是在这个过程中产生了一个新的中间变量 这样做是不好的怎么去避免这个问题 答把外面的对象传给这个函数就是希望这个函数里面可以访问到外面对象的一些属性可以用引用或者指针来代替。 void test1(Car car) {
}输出 没有调用拷贝构造函数
因此建议函数参数中不要使用对象型类型作为函数参数
2.对象型参数作为函数的返回值
class Car {
public:Car() {cout Car() - this endl;}Car(const Car car) {cout Car(const Car ) - this endl;}~Car() {cout ~Car() - this endl;}void run() {cout run() endl;}
};
// 对象型参数作为函数的返回值
Car test2() {Car car;return Car();
}int main() {Car car2; // Car()car2 test2();getchar();return 0;
}这一次在函数里定义了一个对象并且返回对象
// 对象型参数作为函数的返回值
Car test2() {Car car;return car;
}输出结果会发现调用了两次构造函数一次拷贝构造函数 首先就是创建对象时调用了一次
Car car2; // Car()然后就是在函数里创建对象又调用了一次
Car test2() {Car car;return car;
}第三次是函数的返回值返回来一个car对象这个返回值赋给了 car2 对象相当于一次浅拷贝 car2 test2();因为函数调用后会自动销毁里面的栈空间会被回收但是你还要返回对象值所以就会提前拷贝构造出一个新的对象将这个新的对象存在main()的栈空间中。 所以最好不要以对象型类型为函数参数或为返回值会产生很多不必要的中间变量