欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++面向对象基础教程

程序员文章站 2023-10-10 17:32:11
1、结构体成员默认的属性是公共的,而类成员默认是私有的。 C++的结构体也可以设置 public,private。但C语言中不行。 2、内联函数和外联函数 在类体内实现的成员...

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(this) )

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、静态对象:

用法和静态变量类似,只不过其储存位置放在了全局数据区。