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

1.c++可变参数的应用
#include <iostream>
#include <stdarg.h>  //可变参数的支持

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

  • #include <stdarg.h> 如果使用可变参数,需要导入这个
  • 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

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

2.static 静态变量与静态方法
class Douluo {
public:
//    static char * name="唐三";  静态变量不能直接初始化  编译不通过
    static char * name;

    Douluo() {
//         name="唐三";  //静态变量不能在构造方法初始化
    }

    static void update() {

//        name="唐三"; //静态变量不能在静态方法初始化
        cout<<"name="<<name<<endl;

    }

    void update2() {
        // 运行报错
//         name="唐三";  //静态变量不能在非静态方法初始化
    }
};

/*静态变量正确初始化姿势*/
char* Douluo::name="唐三";

int main() {
//    std::cout << "可变参数输出" << std::endl;
//    add(3, 6,7,8);

    std::cout << "static的应用" << std::endl;
    Douluo douluo;
//    Douluo::name="唐三";  //静态变量不能在main方法初始化 会报错
    douluo.update2();
    Douluo::update(); // 类名::可以调用静态函数  调用静态方法的正确姿势
    
    return 0;
}

通过实际操作可知:

  • 静态变量不能在声明的时候初始化,直接编译不通过
  • 静态变量不能在构造方法初始化,运行报错
  • 静态变量不能在静态方法初始化,运行报错
  • 静态变量不能在非静态方法初始化,运行报错
  • 静态变量不能在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 <iostream>
#include <stdarg.h>  //可变参数的支持

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

  • #include <stdarg.h> 如果使用可变参数,需要导入这个
  • 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

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

2.static 静态变量与静态方法
class Douluo {
public:
//    static char * name="唐三";  静态变量不能直接初始化  编译不通过
    static char * name;

    Douluo() {
//         name="唐三";  //静态变量不能在构造方法初始化
    }

    static void update() {

//        name="唐三"; //静态变量不能在静态方法初始化
        cout<<"name="<<name<<endl;

    }

    void update2() {
        // 运行报错
//         name="唐三";  //静态变量不能在非静态方法初始化
    }
};

/*静态变量正确初始化姿势*/
char* Douluo::name="唐三";

int main() {
//    std::cout << "可变参数输出" << std::endl;
//    add(3, 6,7,8);

    std::cout << "static的应用" << std::endl;
    Douluo douluo;
//    Douluo::name="唐三";  //静态变量不能在main方法初始化 会报错
    douluo.update2();
    Douluo::update(); // 类名::可以调用静态函数  调用静态方法的正确姿势
    
    return 0;
}

通过实际操作可知:

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

3.常量指针与指针常量

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

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

this : 本质上就是指针常量

    // 默认现在:this 等价于 const Student * const  常量指针常量(地址不能改,地址对应的值不能改)
    void changeAction() const {
        // 地址不能改
//         this = 0x43563;

        // 地址对应的值不能改
//         this->age = 80;
    }

方法名后边添加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
    

友元函数是为了私有成员在没有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;
}

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
    

友元函数是为了私有成员在没有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;
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值