• Android NDK篇-C++语言之 this 原理和可变参数与友元函数友元类


    1.c++可变参数的应用

    #include 
    #include   //可变参数的支持
    
    using namespace std;
    
    void add(int count,...){
        va_list vp; 
        va_start(vp, count);
        
      
        // 取出可变参数的一个值
        int number  = va_arg(vp, int);
        cout << number << endl;
        
        // 取出可变参数的一个值
        number  = va_arg(vp, int);
        cout << number << endl;
    
        // 取出可变参数的一个值
        number  = va_arg(vp, int);
        cout << number << endl;
    
        // 越界之后取出来的是0
        number  = va_arg(vp, int);
        cout << number << endl;
    
        // 关闭阶段
        va_end(vp);
    
    }
    
    int main() {
        add(546, 6,7,8);
        return 0;
    }
    
    日志输出:
    /home/ms/workspace/study/ndk/CPlusStudy/cmake-build-debug/CPlusStudy
    可变参数输出
    6
    7
    8
    0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • #include 如果使用可变参数,需要导入这个
    • Java的可变参数: int …
    • C++的可变参数写法:…
    • va_list vp : 可变参数的动作
    • va_start(vp, count):参数一:可变参数开始的动作vp,参数二:内部需要一个 存储地址用的参考值,如果没有第二个参数,内部他无法处理存放参数信息
    • 越界之后取出来的是0

    项目中的应用:

    int add(int count,...){
        va_list va;
        va_start(va,count);
    
        for (int i = 0; i < count; ++i) {
            int number=va_arg(va,int);
            cout << number << endl;
        }
        va_end(va);
    }
    
    int main() {
        std::cout << "可变参数输出" << std::endl;
        add(3, 6,7,8);
        return 0;
    }
    
    日志输出:
    可变参数输出
    6
    7
    8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    第一个参数count可以作为可变参数的数量。

    2.static 静态变量与静态方法

    class Douluo {
    public:
    //    static char * name="唐三";  静态变量不能直接初始化  编译不通过
        static char * name;
    
        Douluo() {
    //         name="唐三";  //静态变量不能在构造方法初始化
        }
    
        static void update() {
    
    //        name="唐三"; //静态变量不能在静态方法初始化
            cout<<"name="<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    通过实际操作可知:

    • 静态变量不能在声明的时候初始化,直接编译不通过
    • 静态变量不能在构造方法初始化,运行报错
    • 静态变量不能在静态方法初始化,运行报错
    • 静态变量不能在非静态方法初始化,运行报错
    • 静态变量不能在main方法初始化运,行报错
    • 静态变量只能在类外部,main方法外部初始化:char* Douluo::name=“唐三”;
    • 静态方法使用**类名:😗*来调用

    3.常量指针与指针常量

    int * const 指针常量 指针常量【地址对应的值能改,地址不可以修改】

    const int * 常量指针 常量指针【地址可以修改,地址对应的值不能改】

    this : 本质上就是指针常量

        // 默认现在:this 等价于 const Student * const  常量指针常量(地址不能改,地址对应的值不能改)
        void changeAction() const {
            // 地址不能改
    //         this = 0x43563;
    
            // 地址对应的值不能改
    //         this->age = 80;
        }
    ```### Android NDK篇-C++语言之 this 原理和可变参数与友元函数友元类
    
    #### 1.c++可变参数的应用
    
    ```c++
    #include 
    #include   //可变参数的支持
    
    using namespace std;
    
    void add(int count,...){
        va_list vp; 
        va_start(vp, count);
        
      
        // 取出可变参数的一个值
        int number  = va_arg(vp, int);
        cout << number << endl;
        
        // 取出可变参数的一个值
        number  = va_arg(vp, int);
        cout << number << endl;
    
        // 取出可变参数的一个值
        number  = va_arg(vp, int);
        cout << number << endl;
    
        // 越界之后取出来的是0
        number  = va_arg(vp, int);
        cout << number << endl;
    
        // 关闭阶段
        va_end(vp);
    
    }
    
    int main() {
        add(546, 6,7,8);
        return 0;
    }
    
    日志输出:
    /home/ms/workspace/study/ndk/CPlusStudy/cmake-build-debug/CPlusStudy
    可变参数输出
    6
    7
    8
    0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • #include 如果使用可变参数,需要导入这个
    • Java的可变参数: int …
    • C++的可变参数写法:…
    • va_list vp : 可变参数的动作
    • va_start(vp, count):参数一:可变参数开始的动作vp,参数二:内部需要一个 存储地址用的参考值,如果没有第二个参数,内部他无法处理存放参数信息
    • 越界之后取出来的是0

    项目中的应用:

    int add(int count,...){
        va_list va;
        va_start(va,count);
    
        for (int i = 0; i < count; ++i) {
            int number=va_arg(va,int);
            cout << number << endl;
        }
        va_end(va);
    }
    
    int main() {
        std::cout << "可变参数输出" << std::endl;
        add(3, 6,7,8);
        return 0;
    }
    
    日志输出:
    可变参数输出
    6
    7
    8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    第一个参数count可以作为可变参数的数量。

    2.static 静态变量与静态方法

    class Douluo {
    public:
    //    static char * name="唐三";  静态变量不能直接初始化  编译不通过
        static char * name;
    
        Douluo() {
    //         name="唐三";  //静态变量不能在构造方法初始化
        }
    
        static void update() {
    
    //        name="唐三"; //静态变量不能在静态方法初始化
            cout<<"name="<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    通过实际操作可知:

    • 静态变量不能在声明的时候初始化,直接编译不通过
    • 静态变量不能在构造方法初始化,运行报错
    • 静态变量不能在静态方法初始化,运行报错
    • 静态变量不能在非静态方法初始化,运行报错
    • 静态变量不能在main方法初始化运,行报错
    • 静态变量只能在类外部,main方法外部初始化:char* Douluo::name=“唐三”;
    • 静态方法使用**类名:😗*来调用

    3.常量指针与指针常量

    int * const 指针常量 指针常量【地址对应的值能改,地址不可以修改】

    const int * 常量指针 常量指针【地址可以修改,地址对应的值不能改】

    this : 本质上就是指针常量

        // 默认现在:this 等价于 const Student * const  常量指针常量(地址不能改,地址对应的值不能改)
        void changeAction() const {
            // 地址不能改
    //         this = 0x43563;
    
            // 地址对应的值不能改
    //         this->age = 80;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    方法名后边添加const 符号,表示的意思是常量指针常量,这个情况下值不能改,地址也不能改。

    3.friend 友元函数

    class Person {
    private: // 私有的age,外界不能访问
        int age = 0;
    public:
        Person(int age) {
            this->age = age;
        }
    
        int getAge() {
            return this->age;
        }
    
        // 定义友元函数 (声明,没有实现)
        friend void updateAge(Person * person, int age);
    };
    
    
    // 友元函数的实现,可以访问所以私有成员
    void updateAge(Person* person, int age) {
        // 默认情况下:不能修改 私有的age
        // 谁有这个权限:友元(拿到所有私有成员)
        person->age = age;
    }
    
    int main(){
        Person person = Person(30);
        updateAge(&person, 31);
        cout << person.getAge() << endl;
    
    }
    
    日志输出:
    /home/ms/workspace/study/ndk/CPlusStudy/cmake-build-debug/CPlusStudy
    31
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    友元函数是为了私有成员在没有set方法的情况下,可以通过友元函数来访问私有成员变量。

    4.友元类

    class ImageView {
    private:
        int viewSize;
        friend class Class; // 友元类
    };
    
    // Java每个类,都会有一个Class,此Class可以操作 ImageView私有成员(感觉很神奇)
    class Class {
    public:
        ImageView imageView;
    
        void changeViewSize(int size) {
            imageView.viewSize = size;
        }
    
        int getViewSize() {
            return imageView.viewSize;
        }
    };
    
    int main(){
        Class mImageViewClass;
        mImageViewClass.changeViewSize(600);
        cout << mImageViewClass.getViewSize() << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    Java每个类,都会有一个Class,此Class可以操作 ImageView私有成员,友元类就类比Java的中的Class,如果去掉friend,就不能访问ImageView的成员了。

    方法名后边添加const 符号,表示的意思是常量指针常量,这个情况下值不能改,地址也不能改。

    3.friend 友元函数

    class Person {
    private: // 私有的age,外界不能访问
        int age = 0;
    public:
        Person(int age) {
            this->age = age;
        }
    
        int getAge() {
            return this->age;
        }
    
        // 定义友元函数 (声明,没有实现)
        friend void updateAge(Person * person, int age);
    };
    
    
    // 友元函数的实现,可以访问所以私有成员
    void updateAge(Person* person, int age) {
        // 默认情况下:不能修改 私有的age
        // 谁有这个权限:友元(拿到所有私有成员)
        person->age = age;
    }
    
    int main(){
        Person person = Person(30);
        updateAge(&person, 31);
        cout << person.getAge() << endl;
    
    }
    
    日志输出:
    /home/ms/workspace/study/ndk/CPlusStudy/cmake-build-debug/CPlusStudy
    31
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    友元函数是为了私有成员在没有set方法的情况下,可以通过友元函数来访问私有成员变量。

    4.友元类

    class ImageView {
    private:
        int viewSize;
        friend class Class; // 友元类
    };
    
    // Java每个类,都会有一个Class,此Class可以操作 ImageView私有成员(感觉很神奇)
    class Class {
    public:
        ImageView imageView;
    
        void changeViewSize(int size) {
            imageView.viewSize = size;
        }
    
        int getViewSize() {
            return imageView.viewSize;
        }
    };
    
    int main(){
        Class mImageViewClass;
        mImageViewClass.changeViewSize(600);
        cout << mImageViewClass.getViewSize() << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    Java每个类,都会有一个Class,此Class可以操作 ImageView私有成员,友元类就类比Java的中的Class,如果去掉friend,就不能访问ImageView的成员了。

  • 相关阅读:
    JavaWeb基础之Servlet
    Java架构师内功操作系统
    【webrtc】media base 的 MediaEngineInterface 、CompositeMediaEngine和 MediaChannel
    经纬高坐标转东北天坐标
    《java练级之路》类和对象,博主熬夜肝六个小时万字博客
    牛客刷题<21>三段式状态机
    如何获取UnrealEngine虚幻引擎的WebUI插件
    zzy-project-cli,提供多个框架的脚手架
    redis高可用、redis集群、redis缓存优化
    Debezium系列之:debezium版本升级到2.4.0及以上版本重大注意事项
  • 原文地址:https://blog.csdn.net/u014078003/article/details/126253305