zoukankan      html  css  js  c++  java
  • c++,public/protected/private权限修饰符

    1.public的变量可以在类中以及外部访问到;

    2. private只可以在类/友元中访问到。

    #include <iostream>
    using namespace std;
    //-------------------------------
    class Test {
    public:
        int publicx;
        void publicm();
    protected://当前类和子类
        int protectedx;
        void protectedm();
    private://当前类
        int privatex;
        void privatem();
    };
    
    //--------------------------------
    void Test::privatem() {
        cout << "privatem():
    ";
        this->publicx = 11111;
        cout<<this->publicx<<endl;
    }
    void Test::protectedm() {
        cout << "protectedm()..
    ";
    
    }
    void Test::publicm() {
        cout << "publicm()...
    ";
    
    }
    
    //--------------------------------
    int main() {
        Test t;
        //t.protectedm();//error C2248: “Test::protectedm”: 无法访问 protected 成员(在“Test”类中声明)
        //t.privatem();//error C2248: “Test::privatem”: 无法访问 private 成员(在“Test”类中声明)
        t.publicm();
        while(1);
        return 0;
    }

    3. C++中同一个类的不同对象可以访问对方的private成员吗?

       可以。在同一个对象甚至是同一个类的对象中,private/public/protected的方法和变量是可以无限制的混访的。【个人测试得到的结论,也许不尽完善。】

    4.下面针对private:

    类中的私有成员可以在以下四个地方被访问
    (1)当前类中;
    (2)类的友元函数;//类的友元函数就是在类中把普通的函数用friend进行声明
    (3)类的友元成员函数;//类的友元成员函数就是在类中把另一个类的成员函数用friend进行声明

    (4)类的友元类中所有成员函数;//类的友元类就是在类中把另一个类用friend进行声明

    //类的友元函数:
    class
    Stu { friend void test2(); private: int age; void show( ); } void test1() { Stu stu; stu.age = 23; // stu.show(); // } void test2() { Stu stu; stu.age = 23; // stu.show(); // }
    //类的友元成员函数
    class Stu {
        friend void Teacher::test2();
    private:
        int age;
        void show( );
    }
    class Teacher {
    public:  
        void test1( );
        void test2();
    }
    void Teacher::test2( ) {
        Stu stu;
        stu.age=2; //
        stu.show(); //
    }
    void Teacher::test1( ) {
        Stu stu;
        stu.age=2; //
        stu.show(); //
    }
    //类的友元类 
    class Stu {
        friend class Teacher;
    private:
        int age;
        void show( );
    }
    class Teacher {
    public:  
        void test1( );
        void test2();
    }
    void Teacher::test1( ) {
        Stu stu;
        stu.age=2; //
        stu.show(); //
    }
    void Teacher::test2( ) {
        Stu stu;
        stu.age=2; //
        stu.show(); //
    }

     补充:

    1.C++访问类中私有成员变量的方法

      http://www.51testing.com/html/93/n-843693.html

    /*原则上,C++类中私有变量不允许在类之外的其他任何地方访问,一般来说功能完善的类都会提供get,set方法来操作类属性值,还有就是就是通过友元访问。但是!但如果没有get、set方法都没有提供,也没有定义友元,比如使用的是第三方提供的.o(或者动态库)来进行开发的,并且实际应用中我们确确实实需要改变其中某个对象的一个私有参数,有没有什么办法呢?还有一种比较文艺青年的方法,我们知道,一个进程有程序段和数据段,如果我们知道了对象的数据空间,那么得到该对象的成员变量值也就很简单了,而实际上,对象数据段的首地址其实就是对象地址,以例子说明:*/
    #include <iostream>
    #include <string>
    using namespace std;
    
    class center
    {
    public:
        void setX(float _x){x=_x;}
        void setY(float _y){y=_y;}
        void setMeanValue(float avg){meanValue=avg;}
        float getX(){return x;}
        float getY(){return y;}
        float getMeanValue(){return meanValue;}
        center():x(0.0),y(0.0),meanValue(0.0){}
    private:
        float x;
        float y;
        float meanValue;
    };
    
    int main()
    {
     center A;
     //普通青年的赋值方法;
     A.setX(1.0);
     A.setY(4.0);
     A.setMeanValue(13.0);
     cout<<A.getX()<<" "<<A.getY()<<" "<<A.getMeanValue()<<endl;
     
     //文艺青年的赋值方法;
     //*((float*)&A):将center对象A的内存空间强制类型转化为用int*指向的内存空间,访问该内存
     float tmp = *((float*)&A);
     cout<<tmp<<endl;//输出A.x的值
     tmp = *((float*)&A + 1);
     cout<<tmp<<endl;//输出A.y的值
     *((float*)&A + 2)=2;//修改A.meanValue的值
     cout<<A.getMeanValue()<<endl;
    
    
     while(1);
     return 0;
    }
    //1 4 13 
    //1
    //4
    //2 

    补充:

    构造函数定义为private,protected http://www.cnblogs.com/this-543273659/archive/2011/08/02/2125487.html

  • 相关阅读:
    谷歌Google Chrome浏览器打开新的标签页设置指定固定网址
    Vue子组件和父组件、子组件调用父组件的方法、父组件调用子组件方法、子组件与父组件间的传值
    查询Linux服务器出口IP、curl命令查询Linux公网出口IP、Windows服务器查询出口IP
    mysql查询是对字段进行补0操作,可用于树状结构整体排序
    mysql批量update更新,mybatis中批量更新操作
    CentOS 6.8下网卡配置、桥接模式和NAT连接模式、VMware虚拟机克隆网卡配置
    杂七杂八
    解决SpringMVC拦截器中Request数据只能读取一次的问题
    Redis安装教程及可视化工具RedisDesktopManager下载安装
    JAVA获取客户端请求的当前网络ip地址(附:Nginx反向代理后获取客户端请求的真实IP)
  • 原文地址:https://www.cnblogs.com/mylinux/p/4092595.html
Copyright © 2011-2022 走看看