【翁恺】Cpp教程视频随笔

29.静态成员——对类的简单整理

对于一个类,需要配置一个 .h.cpp 文件,其中 .h 中放置的是类的声明,.cpp中放置类的方法实体。(若一个类的方法实体写在 .h 的声明中,将被当做inline函数——作用是减少堆栈开销,编译器自动将函数实体填入inline函数中。

对于inline函数,只需要一个**.h** 文件即可,编译器会自动将其函数实体补充到inline函数调用部位。注:一般2~3行的类方法可以直接写在 .h 文件中 对于多层循环体中所调用的函数可以采用inline函数节约开销。

对于创建一个类,最好直接写上3个函数——1、构造函数 2、拷贝构造函数 3、virtual的析构函数

对于以类为函数参数或者对类进行拷贝构造时,最好采用指针或者引用。 由于CPP一切都是骗人的,指针与引用的格式最好写成const T* a 或者const T& a。用来保证不会通过指针或者引用修改所指对象的成员变量。

多态性,实际上是采用隐藏指针的方式。当类中具备virtul函数时,实际的操作是类的对象创建时(T a或者其他类型),a得地址和a中第一个成员变量的地址(成员变量的地址变成了a对象地址+1)不再一致,而是a的存在一个vptr指针,其所指想的vtable里存放着各自的函数指针。

对于virtual函数,要注意当父类中具备overloading的情况,子类必须对每一个overloading函数定义相应的函数,否则会发生namehiding。

类的private、public、protected是针对类与类的,对于同一个类的对象,是可以访问成员变量的。继承的本质是一个子类将父类的所有内容复制过来并在后面添加自己的内容。注:一个对象只有成员变量而不具有成员函数。

另.注:const 在 或者 & 之前时,仅仅是指不能通过所const的指针或者引用修改所指变量或者地址的变量,实际通过别的方式访问到还是能够修改的。有const的变量一定要初始化。*

对于static标识,对于class和func而言,所指变量都是全局变量,但是class里的内容全都为声明,所以对于class中要使成员变量采用static,需要在其**.cpp**中定义相应变量,例如:int T::i。 对于在某个.cpp文件中对某个全局变量使用static,其表示该变量只能在这个.cpp文件中被识别。注:对于类中,如果存在静态成员变量,不能对其采用initialization list对静态成员变量初始化,静态成员变量只能通过其定义的地方初始化。initialization list只能对动态成员变量初始化。

类的定义
可以通过以下两种方式访问:
静态成员变量访问方式
如果i是private则同样不可访问。

静态成员函数就是全局的,因为cpp中成员函数不跟随类。
静态变量或函数,都可以在创建对应类对象前就访问得到。
静态成员函数只能调用静态成员变量。
在静态成员函数中,不能使用this指针,因为我们可以只用T::func()调用静态函数,无法分辨this为哪个具体对象。原因是因为有什么需要在没有对象时调用静态成员函数,而此时没有this指针,也没有创建动态变量,所以不能再静态成员函数中使用非静态成员函数或变量。

30.运算符重载

以下是可以被重载的运算符:

以下运算符是不能被重载的:

1、只能对现有的可重载符号进行重载。
2、只能对类或者枚举中用的运算符进行重载。
3、重载的运算符必须保持其原有操作数个数;必须保持原有的优先级。

当重载的运算符属于某个类时,默认其中一个操作数是this所指,只需要定义一个操作数的重载函数
当重载运算符不属于任何类时,要定义完整的操作数作为重载函数的参数。

当运算符属于某个类时的定义:
在这里插入图片描述
函数声明的右侧加上const表示该成员函数不会改变成员变量值。

运算符的receiver是运算符左边的操作符。
例如:

z=x+3 是可以被允许的,因为所具备的构造函数是:

注:自动类型转换只允许增加字节 int->double ,如果要实现double->int需要强制类型转换 (int)。自动转换得看构造函数的参数

操作符重载是否做成成员函数的建议:

操作符重载函数原型:



对于 = 的运算符重载,如果内部需要动态分配内存,那么最好重载运算符。否则也可以用系统自带的方式。对于 = 运算符重载,需要在重载函数中加入if(this != &that),用来防止 a = a ,内容就有可能被覆盖。

对于自动类型转换,好像是只有单个参数的构造函数可以进行自动类型转换。

当构造函数前加上explicit时,表示告诉编译器构造函数只能用于当作构造函数,不能用于自动类型转换。

需要手动用构造函数构造出所需类型,如下图操作:

除了上述方法,可以operator 一个类型转换函数。
例如:构造一个double() 函数。

类型转换函数原型:

类型转换总结(能够类型转换表示右边的类型能够赋值给左边的类型变量)

!!!尽量采用自己定义类型转换的普通函数,而不是依赖于operator或者构造函数的自动转换,可能会造成误操作。

当具有函数模板时,自动类型转换将被忽视。

40.流的运算符

流的操作子(函数):

计算机中习惯用语,set是指置位(置1),reset指置0。

计算机习惯用比特做标志位,要多重组合就用or,当要识别时就用and不同数值进行比较,例如flag中的第四位showpoint,就是2的4次幂的值。

41.STL

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值