栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

  • #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

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

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

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

    static void update() {

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

通过实际操作可知:

  • 静态变量不能在声明的时候初始化,直接编译不通过
  • 静态变量不能在构造方法初始化,运行报错
  • 静态变量不能在静态方法初始化,运行报错
  • 静态变量不能在非静态方法初始化,运行报错
  • 静态变量不能在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

  • #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

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

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

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

    static void update() {

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

通过实际操作可知:

  • 静态变量不能在声明的时候初始化,直接编译不通过
  • 静态变量不能在构造方法初始化,运行报错
  • 静态变量不能在静态方法初始化,运行报错
  • 静态变量不能在非静态方法初始化,运行报错
  • 静态变量不能在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的成员了。

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1037658.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号