- #include <iostream>
- using namespace std;
- class A{
- public:
- A(){
- cout << "执行构造函数创建一个对象" << endl;
- }
- A(A&){
- cout << "执行拷贝函数拷贝一个对象" << endl;
- }
- ~A(){
- cout << "执行析构函数删除一个对象" << endl;
- }
- };
- void func(A a){
- cout << "调用一个传值函数" << endl;
- }
- void func2(A &a){
- cout << "调用一个传址函数" << endl;
- }
- A getA(A a){
- return a;
- }
- A getA2(A &a){
- return a;
- }
- /**
- * 同getA4
- */
- A* getA3(A &a){
- return &a;
- }
- /**
- * 同getA3
- */
- A* getA4(A *a){
- return a;
- }
- /*
- * 按值传递的缺点...当创建一个新的对象之后,如果按值传递
- * 将复制构造函数创建对象的副本,副本在使用完成之后,又会执行析构函数删除该副本!
- */
- int main(int argc, char** argv) {
- A a;
- func(a);
- func(a);
- cout << "-------" << endl;
- func2(a);
- func2(a);
- cout << "-------" << endl;
- getA(a); // 将拷贝2个对象和删除2个对象,1个对象是作为参数传递的,另外一个对象是作为值返回的!
- cout << "-------" << endl;
- getA2(a); // 将拷贝1个对象和删除1个对象,该对象是作为值返回的!
- cout << "-------" << endl;
- getA3(a); // 将不拷贝a的对象做为参数,也不会拷贝a的对象作为返回值(包括删除)!
- getA4(&a);
- return (EXIT_SUCCESS);
- }
执行构造函数创建一个对象
执行拷贝函数拷贝一个对象
调用一个传值函数
执行析构函数删除一个对象
执行拷贝函数拷贝一个对象
调用一个传值函数
执行析构函数删除一个对象
-------
调用一个传址函数
调用一个传址函数
-------
执行拷贝函数拷贝一个对象
执行拷贝函数拷贝一个对象
执行析构函数删除一个对象
执行析构函数删除一个对象
-------
执行拷贝函数拷贝一个对象
执行析构函数删除一个对象
-------
执行析构函数删除一个对象
执行拷贝函数拷贝一个对象
调用一个传值函数
执行析构函数删除一个对象
执行拷贝函数拷贝一个对象
调用一个传值函数
执行析构函数删除一个对象
-------
调用一个传址函数
调用一个传址函数
-------
执行拷贝函数拷贝一个对象
执行拷贝函数拷贝一个对象
执行析构函数删除一个对象
执行析构函数删除一个对象
-------
执行拷贝函数拷贝一个对象
执行析构函数删除一个对象
-------
执行析构函数删除一个对象