C++的复习---DAY3

1、Static修饰类的成员

回顾一下Static的作用:

1.static修饰的局部变量:延长局部变量的声明函周期;

2.static修饰全局变量:限制全局变量的作用域;

3.static修饰函数:限制了作用域。

static修饰的变量,什么时候就已经存在了?------->编译阶段。

1-1.static修饰类的数据成员

1.类内做声明,类外部做定义+初始化;

2.类要访问成员函数:必须要使用对象;

3.当全局变量的名字与命名空间中的名字一样的时候,要通过::+变量名的方式去区分。

类的static修饰的数据成员初始化的格式:数据类型 类名::变量名 = 初始值;

如何初始化:

        数据类型 类名::变量名 = 初始值;

如何访问:

        通过对象的方式去访问:对象名.变量名;

        通过类的方式去访问:类名::变量名;

结论:

1.类的静态的数据成员要类内做声明,类外初始化!

2.类的静态的数据成员属于类,不属于具体的某一个对象;但是所有的对象都可以访问!

3.类的静态的数据成员没有对象,也可以访问!

1-2.static修饰的成员函数

static int getCount();

return this->count;出错

"this"指针只能用于非静态成员函数内容,为什么?

结论:

1.类的静态成员函数中是没有this指针的,因为类的静态的成员函数没有对象也是能使用的!this存在没有任何的意义!

2.类的静态的成员函数是不能访问类的非静态的成员!

3.类的非静态的成员函数是可以访问类的静态的成员!

4.类的静态的成员函数的访问:对象的方式和类的方式都是ok的!

思考:什么时候会把类的数据成员和成员函数用static修饰呢?

想要实现数据共享的过程,就可以把数据用static去修饰,要记得做初始化成员函数;当要在多个类中都使用到这个函数,就可以把它用static修饰变成静态的成员函数,这样在其他类中可以通过类名::成员函数();访问。

2、Const修饰类的成员

const的作用:

const int a = 100;//a 的值不可以修改,此时a相当于常量;

int b = 10;

const int *p = &b;//*p的值是不可以改变的,p的指向是可以变化的;

int * const p = &b;//p 的指向是不可以变化的,但是地址中的值是可以修改的(*p);

2-1.const修饰类的数据成员

如果const修饰类的数据成员,那么在构造函数中无法对数据成员进行初始化;

如何解决这个问题?

使用初始化列表的方式给const修饰的数据成员进行初始化;

格式:类名():a(a){}//初始化列表;

非const修饰的数据成员也可以使用初始化列表进行初始化,除了static修饰的;

初始化列表的顺序并不会影响数据成员的赋值!

初始化列表只能出现在构造函数的地方。

当一个类中都const修饰数据成员,并且这个类里面有许多构造函数,那么在每一个构造函数中都要使用初始化列表对const修饰的数据进行初始化!

普通的成员函数是可以访问const修饰的数据成员,但是不可以修改!

2-2.const修饰类的成员函数

非const修饰的成员函数中的this的类型:Demo *const this;

说明:this是不可以修改的,但是*this里面的内容是可以修改的。

const修饰的成员函数中this指针的类型为:const Demo * const this;

说明:this是不可以修改的,*this的值也是不可以修改的。

总结:

const修饰类的成员函数,本质上修饰的事隐藏的this指针;

const修饰的成员函数,只能访问类的成员,不能修改。

const修饰的成员函数就是常函数!

const修饰的成员函数中不能访问非const修饰的成员函数!

非const修饰的成员函数中是可以访问const修饰的成员函数!

2-3.const修饰类的对象

总结:const修饰类的对象只能调用const修饰的成员函数!

3.mutable关键字的作用

作用:解决const修饰类的成员函数不可以修改数据成员值的问题。但尽量少用,C++有提供约束的方法,同时也提供了打破的方法!

4.友元

什么是友元:就是朋友的意思

分类:友元函数以及友元类

关键字:friend

为什么会有友元的出现?

        打破规则的!

        在类外当要访问类的私有的数据成员,只能通过public区共有的接口函数来访问,如果访问次数比较少,调用接口函数对内存的消耗不会很大!如果频繁访问,调用函数要进行出入栈,出入栈的次数越多,对内存的开销就越大!此时再想,如果能够直接去访问到私有取得数据成员多好!

实现方法:使用友元!

几种情况:友元函数

        <1> 普通函数做类的友元

        <2> 类里面的成员函数做另一个类的友元

        <3> 友元类:类中多个函数中都要频繁的访问私有的数据成员,把整个类都作为友元!(一个类做另外一个类的友元)

4-1.普通函数做类的友元

        格式:friend void update(DemoA & demo);

        这个函数中要频繁的访问DemoA类中的私有的数据成员,就把这个函数作为类的友元函数,此时在这个函数中就可以访问到类的私有成员。

        这个函数中要频繁的访问DemoA类中私有的数据成员,就把这个函数作为类的友元函数。此时在这个函数中就可以访问到类的私有的成员。

总结:什么时候执行拷贝构造:

        <1> 类对象作为函数形参的时候,调用函数的时候也会执行拷贝构造函数!

        <2> 用一个已经存在的对象去初始化一个正在创建的新的对象的时候,执行拷贝构造函数!

如何使用引用传参:类对象要作为函数参数的时候,建议使用引用传参!

4-2.类的成员函数做类的友元

思路:当类B的成员函数要做类A的友元,要先定义类B,并且类B中的成员函数要做类的外部去做定义!在类B中又出现类A这个类型,先对类A做前向声明!

注意:类的友元函数并不是类的成员,所以不受类的访问限定符的限制!放在public、private、protected声明区都是可以的!

4-3.类做友元

把整个类B做为类A的友元!

总结:

友元的使用会破坏类封装的完整性以及代码的可读性,所以尽量少用!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值