美文网首页
C++拷贝构造函数和友元

C++拷贝构造函数和友元

作者: idea0 | 来源:发表于2016-12-16 11:07 被阅读21次

    拷贝构造函数和友元

    C++控制类对象私有部分的访问,但有时候需要在类的外部访问类的私有成员,这种情况下C++提供了友元机制。

    //
    //  main.cpp
    //  CPlusPlusLanguage
    //
    //  Created by idea on 2016/12/16.
    //  Copyright © 2016年 idea. All rights reserved.
    //
    
    #include <iostream>
    using namespace std;
    
    class demo{
    private:
        int i;
    public:
        demo(){  //构造
            cout << "demo" << endl;
        }
        demo(const demo &it){  //拷贝构造
            cout << "copy demo" << endl;
        }
        
        ~demo(){   //析构
            cout << "~demo" << endl;
        }
        
        void set_i(int i){
            this-> i= i;
        }
        
        int get_i(){
            return i;
        }
        
        friend void test_3();;//意思是声明一个该类的友元函数
        friend class demo1;//意思是声明一个该类的友元类
        
    };
    
    int main_1(int argc, const char * argv[]) {
        demo d;         //声明一个实例,自动调用构造函数
        d.set_i(100);
    //    demo d1=d;      //这个操作导致拷贝构造函数的调用
    //    demo d1(d);       //和上面的语句等效
        
        demo d1;
        d1=d;               //这个地方没有调用拷贝构造,只是简单的=号赋值
        
        std::cout << "d1.get_i()=" << d1.get_i() << endl;
        std::cout << "Hello, World!\n";
        return 0;
    }
    
    void test(demo d){
        d.set_i(100);
    }
    
    void test_1(demo &d){ //在c++里面,如有一个函数的参数是对象,就会有拷贝构造发生,使用引用可以避免
        d.set_i(100);
    }
    
    
    int main_2(int argc, const char * argv[]) {
        demo d;         //声明一个实例,自动调用构造函数
        test(d);        //类作为参数传给另外一个函数,会调用拷贝构造函数
        
        std::cout << "d.get_i()=" << d.get_i() << endl; //这个地方输出未被初始化的值
        std::cout << "Hello, World!\n";
        return 0;
    }
    
    
    demo test(){
        demo d;
        return d;
    }
    
    int main3(int argc, const char * argv[]) {
        demo d=test();         //不同的编译器和不同的操作系统 回有不同的结果,表示:c++只是一种规范,跨平台的应用要考虑这个问题
        std::cout << "Hello, World!\n";
        return 0;
    }
    
    
    void test_3(){
        demo d;
        cout << d.i << endl;
    }
    
    class demo1
    {
    public:
        demo1()
        {
            demo d;
            d.i = 100;
        }
        friend class demo2;
    };
    
    
    class demo2
    {
    public:
        demo2()
        {
            demo d;
    //        d.i = 100; //我的朋友的朋友,不能等同于是我的朋友
        }
    };
    
    
    int main(int argc, const char * argv[]) {
        test_3();
        std::cout << "Hello, World!\n";
        return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:C++拷贝构造函数和友元

          本文链接:https://www.haomeiwen.com/subject/tpdnmttx.html