C++:03.可变参数、static、对象大小和友元类、函数

知识点:

1. 可变参数

java中:int ...
c++:...

  • va_start(vp,count);:将可变参数放到va_list vp中去,这个宏必须在使用 va_arg 和 va_end 之前被调用。
  • int number = va_arg(vp,int);: 获取可变参数,如果超出了可获取的范围默认就为0
  • va_end(vp);:结束了释放内存。
void sum(int count,...){// java:int ..., c++: ...
    va_list vp;
    // 可变参数开始方法, count 最后一个传递给函数的已知的固定参数。
    va_start(vp,count);

    int 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(){
     sum(5,1,2,4);
}

打印结果:

1
2
4
int sum(int count,...){// java:int ..., c++: ...
    va_list vp;
    // 可变参数开始方法, count 最后一个传递给函数的已知的固定参数。
    va_start(vp,count);

    int sum = 0;
    for(int i = 0; i<count;i++){
        int number = va_arg(vp,int);
        sum += number;
        cout << i << ":" << number << endl;
    }

    // 结尾,释放内存
    va_end(vp);

    return sum;
}

int main(){
    int number = sum(4,1,2,4,0); // 7
    cout << number << endl;
}

打印结果:

0:1
1:2
2:4
3:0
7

2. static 关键字

总结:

  1. 静态的属性定义时**必须要初始化** (实现) int Student::tag = 12;
  2. 静态 可以直接用类名去操作 :: Student::tag += 12;
  3. 静态的方法只能去操作静态的属性或者方法
class Student{
public:
    char* name;
    int age;
    //静态
    static int tag; // 定义

    Student(){
        tag = 12; // 这里不算初始化
    }

public:
    static void change(){
        tag += 12;
    }

    void change1(){
        this -> change();
    }
};

// 静态属性在 c++ 中必须要初始化,初始化必须这么写
int Student::tag = 12;

// 静态 可以直接用类名去操作 ::
//      静态的属性必须初始化(实现)
//      静态的方法只能去操作静态的属性或方法

int main(){
    Student stu;

    // stu.tag = 12;
    // c++ 操作静态语法 ::
    // Student::tag += 12;
    // Student::change();
    stu.change1();

    cout <<Student::tag << endl;
}

打印结果:

24

3. 对象大小

  1. 对象的大小与结构体的计算方式类似
  2. static 静态变量和方法并没有算到类的大小中
  3. 栈,堆,全局(静态,常量,字符串),代码区 ,类的大小只与普通属性有关系
class A{
public:
    double b;
    int a;
    char c;
};

class B{
public:
    double b;
    int a;
    char c;
    static double d;
};

class C{
public:
    double b;
    int a;
    char c;
    C(int a){
        this->a = a;
    }

public:
    int getA(){
        return this->a;
    }
};

// 1. 对象的大小与结构体的计算方式类似
// 2. static 静态变量和方法并没有算到类的大小中
// 3. 栈、堆、全局(静态、常量、字符串),代码区,类的大小只与普通属性有关系
int main(){
    cout << "A 的大小: " << sizeof(A) <<endl; // 16
    cout << "B 的大小: " << sizeof(B) <<endl; // 16
    cout << "C 的大小: " << sizeof(C) <<endl; // 16

    C c1(12);
    C c2(24);
    cout << c1.getA() << endl;
    cout << c2.getA() << endl;

}

打印结果:

A 的大小: 16
B 的大小: 16
C 的大小: 16
12
24

4. this 指针

this 指针:代表当前的对象,因为类的方法放在代码区,大家一起共享的,所以要有 this 做区分

5.const 修饰函数

const 在 () 之后主要用来限制 this 关键字,this 的值和地址都不能修改

    // this = const Student* const this
    // 第一个 const : 常量指针, 代表值不能修改
    // 第二个 const : 指针常量,代表指针的地址不能修改
    void change() const { // const 在 () 之后主要用来限制 this 关键字
        // this->age + = 12;
        // this = (Student)0x0012;
    }

6.友元函数

作用:友元函数是可以在外部访问其私有属性的

class Person
{
 private:
	 int age = 0;

public:
	// 如果有自己写构造函数,那么会默认覆盖无参的构造函数
	Person(int age){
		this->age = age;
	}
	// 友元函数的声明
	friend void friend_change(Person *person, int age);
};

// 友元函数的实现
void friend_change(Person *person, int age){
	// 修改一下 age 的值
	// 在类的内部才能访问私有属性
	// 如果该方法声明成友元函数那么是可以在外部访问其私有属性的
	person->age = age;
}

int main(){
    Person person = Person(24);

    friend_change(&person,36);

    cout << person.getAge() << endl;
}

打印结果:

36

注意:调用的时候使用 类名::

6.1 友元函数与普通函数的区别

  • 友元函数:直接方法名调用。
  • 普通函数:需要对象名::+方法名 调用

7.友元类

作用:友元类是可以在访问其附属类的私有属性

class  ImageView
{
public: // B 是 A 的友元类
	friend class Class;
private:
	int a;
};

class Class
{
public:
	ImageView aObj;

	void changeA(int number){
		aObj.a = number;
	}

	int getA(){
		return aObj.a;
	}
};

int main(){
    Class b;
    b.changeA(12);

    cout << b.getA() << endl;
}

打印结果:

12
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程目标本课程详细讲解了C++的所有关键字,包括C++11和C++20新增的关键字和语言特性适用人群本课程并非零基础,适合有C语言基础,尤其是学过嵌入式linux核心课程的《C语言高级专题》的同学。课程简介《跟朱老师从C高级到征服C++》属于系列课程《朱有鹏老师热门编程语言全解》的第一部分,主要针对C++语言完全学习。本课程可以看做是嵌入式linux核心课程中《C语言高级专题》课程的延续,在学好了C语言前提下继续深度学习C++语言。整个课程共分为5部分。涵盖了C++基础语法和使用,面向对象,STL与泛型,Boost库和设计模式,C++编程优化技巧等非常广泛的内容,是市面上非常缺少的深度完整学习C++,培养编程技能和修养的一套系列学习课程。整个课程预计2020年底前录制完成,总时长预计150-200小时。朱老师C++第1部分-从C到C++朱老师C++第2部分-C++和面向对象朱老师C++第3部分-STL等高阶话题朱老师C++第4部分-Boost库和设计模式朱老师C++第5部分-C++编程优化课程特色*完全零基础,降低学习门槛。*深入浅出,通俗易懂。不怕学不会,就怕你不学习。*思路清晰、语言风趣,对着视频看也不会想睡觉······*视频 + 文档 + 练习题 + 答疑,全方位保证学习质量。*基础知识 + 思路引导的教学方式,授之以鱼更授之以渔。*系列课程。本教程只是入门篇,后续还有更多更精彩视频更新中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值