C++面向对象基础教程
1、结构体成员默认的属性是公共的,而类成员默认是私有的。
C++的结构体也可以设置 public,private。但C语言中不行。
2、内联函数和外联函数
在类体内实现的成员函数称为内联函数,在调用处用内联函数体的代码来替换,提高运行速度。在类体外实现的成员函数称为外联函数。外联函数转换成内联函数时只要在外部函数定义前加上 inline 就可以,不需要在类内部声明处加。
3、不宜使用内联函数的两种情况:
1)函数体代码较长,使用内联函数将导致内存消耗代价较高。
2)如果函数体出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
4、 this 指针:
this 指针只有在成员函数中才确定其存放的位置,并可以使用 this 指针访问数据成员。使用 this 指针可以预防成员函数形参和成员变量重名,导致函数中成员变量被隐藏出现的问题。
5、构造函数是否会出现函数形参和成员变量重名问题?
不会,构造函数的初始化表有严格的格式定义,系统能够感知到括号外面是类的成员变量,括号内是构造函数的参数。
6、 const 变量在 C 和 C++ 中的区别:
C 语言中,const修饰的变量可以通过访问变量的地址,间接修改变量的值,但在 C++中不行。因为 C++中的 const 通常当成编译器的常量来处理,也就是说编译器不为 const常量分配空间,只是在编译时将它的值保存在名字表中,所以通过内存地址间接修改常量的值,不管修改多少次,其结果都是存放在名字表中的初值。若想让 const 常量值和其对应地址中的同步,加上 volatile 关键字就行(例如:volatile const int a = 1;)
7、C++中,const 在类与对象中的应用:
1)常量数据成员的应用:const 数据成员的初始化必须在构造函数的初始化表中进行。
2)函数参数为常量的应用:类中函数成员的参数通常使用引用,表示用源头的数据,不会再复制一份。如果希望传递给函数成员的参数不被破坏,就需要定义成 const 。(例如:void set(const int &x) { } )
3)常量成员函数与常量对象的使用方法:
对象调用常量函数规则:
1、非常量对象既可以调用常量函数,也可以调用非常量函数。
2、常量对象可以调用常量函数,不可以调用非常量函数。
3、常量函数和非常量函数重载时,常量对象调用常量函数,非常量对象调用非常量函数。
8、突破常量成员函数修改数据成员的限制:
1)为什么不能改?
每个成员函数隐藏了一个指向对象本身的 this 指针参数,this 指针的类型取决于对象,如果是常量对象,this 当然就是常量指针。此时,我们不能通过 this 指针去修改对象对应的内存块。但这是编译器的限制,有两种方法可以突破此限制:
1、将 this 常量指针转换成非常量指针:
将 this 常量指针的属性去掉,可以使用 const_cast 运算符完成。
( DEMO *p = const_cast
2、修改数据成员的存储类型,允许该数据成员可以在常量函数中被修改:
传统的存储类型有 auto, static, register, extern 四种。
auto:表示数据块作用域内局部变量的默认存储类型。
static:表示全局变量的默认存储类。
register:表示提示编译器把局部变量或函数的形参尽可能放入CPU的寄存器中,以便快速访问。
extern:表示全局变量可以被各个对象模块访问。使用extern 关键字时,表示变量已经在别处定义了,所以不能在此处初始化。
C++中又引用了一种新的存储类型:mutable。该存储类型只能用于类的数据成员,不能用于普通变量。具有 mutable 属性的数据成员允许常量函数修改类的 mutable 的数据成员。(mutable int a;)
9、static 常见用法:
1)静态全局变量和普通全局变量:
作用域不同,前者作用于当前源文件,后者作用于整个工程(其他文件可以通过 extern引用)。都存储在全局数据区,初始化为0。
2)静态局部变量和普通局部变量:
1、存储位置不同。前者在全局数据区,作用域是局部的,外部不能调用,不会因为某个子函数的完成而释放内存空间;后者存放在栈区。
2、默认初始值不同。如果没有初始化,静态局部变量默认的初值是0,普通局部变量的初值是随机值。由于静态局部变量的生命周期是全局的,所以对其初始化只会执行一次,后面遇到合法初始化操作将自动跳过。而局部变量的生命周期是局部的,所以合法的初始化动作每次都会执行。
3)静态函数和普通函数:
主要是作用域不同,静态函数的作用域是当前文件,对该工程其他的源文件是隐藏的、不可见的,而普通函数的作用域在整个工程都是可以调用的。
10、静态成员变量:
① 静态数据成员是属于整个类的,而不是属于某个对象的。不管实例的对象有多少个,它们都共用同一个静态数据成员。普通静态白能量如果没有初始化,默认为0,而静态成员变量必须手动初始化才能用。它需要在类外进行静态变量初始化。
格式:数据类型? 类名 :: 静态成员名 = 初始值;
例如: int? DEMO :: b = 100;
② 静态数据变量的特点:
1)即使没有实例对象,仍然可以访问静态数据成员。
2)静态数据成员存储在全局数据区中,因此静态数据成员定义时需要分配空间,所以不能在类声明中初始化。
静态数据变量的独特访问方式:
格式:对象名.成员名。
例如:cout<
在成员函数中可以通过this 指针定义静态数据成员。
遇到 const 和 static 双重属性的数据成员时,初始化动作只能在声明时进行。
③ 对于成员函数来说,static 和 const 不能共存。
静态数据成员可以时 const 的,但是静态函数成员不能是常量函数。如果类的成员函数是 static的,该成员函数属于类的一部分,不再独立属于任何对象,所以静态成员函数中没有指针,但是常量成员函数的第一个参数是常量指针。所以不能共存。
11、静态成员函数:
静态成员函数是类本身的一部分,不独立属于某个对象,因此 this 指针的存在就没什么意义了,所以静态函数无法访问普通的成员变量,它只能调用其余的静态成员。
12、静态对象:
用法和静态变量类似,只不过其储存位置放在了全局数据区。
上一篇: Python pickle类库介绍(对象序列化和反序列化)
下一篇: oracle对汉字的排序