《Visual C++编程之道》笔记

阅读了《Visual C++ 编程之道》,对书中的一些知识点做一个记录。

1、初始化静态成员的陷阱

在成员变量的类型或者方法返回值类型的前面加上关键字static,就能将该成员定义为静态成员,静态成员属于类而不属于实例。在一个应用程序中,无论创造了一个类的多少个实例,该类的静态字段都只会被初始化一次。

2、注意复合赋值

在复合赋值时,例如将short和int类型的数值相加,要注意是否会发生溢出。

3、switch语句记得加上break

在使用switch语句时,如果在case语句块结束后,没有使用break语句结束整个switch语句的执行,程序会从匹配的case语句开始一直执行下去,直到遇到break语句或执行完整个switch语句才能结束,这样会导致不符合条件的语句也会被执行。

4、溢出错误

举个例子,char Names[3][5],程序在对每一行的输入时不能超过4个字符,一旦超过运行结果就会不正确,这是因为二维数组的每一行只给出5个字节的空间,其中第5个字节是用来存储结束标记’\0’的。

5、数组的定义与初始化

数组的定义为int *p = new int[12], 初始化int m(12)

6、逻辑运算符的效率

“&&”和“&”运行效率不同,当使用“&&”连接起来的两个逻辑值,如果第一个逻辑值为false,那么就不再判断第二个逻辑值的真假;而用“&”不同,不管第一个逻辑值是真是假,都需要对第二个逻辑值进行判断,所以使用“&”比“&&”运算效率低。“|”和“||”同理。

7、重载和重写的区别

要分清重载和重写的区别,重载方法是指在类中有两个或两个以上的同名方法,但各个方法中的参数类型、参数个数或顺序不同。重写是指子类中含有与父类相同的方法名和参数,但是子类中的方法覆盖了父类中的方法。

8、进程和线程

进程和线程都是操作系统运行程序的基本单元,系统利用该基本单元实现系统对应用的并发性。一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

9、同类型的类对象赋值

两个同类型的类对象之间的赋值不一定需要重载等号运算符,利用类的构造方法同样可以实现这样的功能。

10、结构大小不一定等于各数据类型之和

理论上是相等的,但实际上并不一定是对的,因为结构体本身是可以字节对齐的,结构体的字节对齐是指编译器在为结构体变量分配内存时,保证下一个成员的偏移量为成员类型的整数倍。

11、常量方法修改类成员

在类中定义了一个常量方法,如果将成员变量定义了mutable就可以在常量方法内部修改这个数据成员。

12、静态成员

静态数据成员独立于所在类的任何对象,因为静态数据成员在其所在类对象创建前就被创建了。在C++语言中类的静态数据成员在初始化时比较特殊,因为它并不是类的定义中被初始化,而是在类的定义外被初始化的。如果没有必要尽量不要使用静态数据成员,如果一定要使用,就要正确地对其进行初始化操作,否则会出现编译错误。

13、free和delete释放指针

对于内存区域的创建,可以使用两种方法,一个是使用malloc函数创建指定大小的内存空间;另一个是使用new创建内存空间。这两种方法所返回的都是一个内存地址空间,并且在使用后如果不进行释放就会造成垃圾内存。所以在所创建的内存空间使用完后,需要用free和delete删除用malloc和new创建的内存空间。但需要注意的是free和delete只是把指针所指向的内存空间释放掉了,并没有将指针本身释放掉,所以需要开发人员手动将指针的值置为NULL。

14、非零对数值赋值

int nArray[5]={1}注意的语句只会导致nArray中的第一个元素为1,而其余的元素值为0,也就是说对数组进行初始化时,如果没有指定元素值,其默认的初始值为0。

15、位图数据存储

位图颜色数据存储的方式不是按照红、绿、蓝的顺序存储,而是按照蓝、绿、红的顺序存储的。并且对于真彩色位图来说,位图的颜色数据是倒序存储的,即位图的第一行数据位于位图数据的最底部。

16、枚举类型

当要实现以下情况:
const int RS_OPEN = 1;
const int RS_EDIT = 2;
const int RS_CLOSE = 3;

可以采用枚举的方式,如enum RecordsetState {RS_OPEN,RS_EDIT,RS_CLOSE},在定义枚举类型时,可以为各个枚举常量提供一个整数值,如果没有提供整数值,默认第一个常量值为0,第二个常量值为1,以此类推。如果是enum RecordsetState {RS_OPEN=3,RS_EDIT,RS_CLOSE=6}没有为RS_EDIT显性提供默认值,则为前一个枚举常量值加1,因此RS_EDIT的值为4.

17、共用体类型

对于结构体类型来说,其中的每一个成员都占用不同的内存空间,即每个成员都有自己独立的空间。而共同体不同,共同体中的所有成员共享同一个内存空间。在C++中,使用union关键字定义共用体类型。共用体变量占用的空间与共用体中占用最多空间的成员所占用的空间是相同的。

18、内存中的数组

在C++中通过数组可以操作内存,创建数组时需要为数组分配内存空间,操作数组时就是对内存空间中的数组元素进行操作。数组创建后,数组的引用与数组元素分别存储在栈内存和堆内存中,并通过数组的引用与数组元素的下标值对数组元素进行操作。实例:

int value[] = {10, 20, 30, 40, 50, 60};

上面代码创建了一个数组,数组的引用是value,数组有6个元素分别是10、20、30、40、50、60,分布为value分布在栈内存中,6个元素分布在堆内存中。

19、函数重载

①函数的返回值类型不作为区分重载函数的一部分
②对于普通的函数参数来说,const关键字不作为区分重载函数的标识
③参数的默认值不作为区分重载函数的标识
④局部域中声明的函数将隐藏而不是重载全局域中的函数

20、默认构造函数的意义

因为类不是一个实体,类只是一种抽象的描述,这种抽象类型是不占用存储空间的,所以无法保存数据,当然就不能为类中的成员变量进行初始化操作。为了解决这个问题,C++中提供了构造函数来处理对象的初始化。

21、虚函数的意义

如果该基类有多个派生类,每个派生类又产生新的派生类,形成了同一基类的类族。每个派生类都有同名函数display,在程序中要调用同一类族中不同类的同名函数,就要定义多个指向各派生类的指针变量。用虚函数就能顺利地解决这个问题。虚函数可以使操作趋于一般化,其重要性在于方便以后新增基类。派生类在继承了基类的成员虚函数后,其虚函数表中派生类的虚函数会将基类的虚函数覆盖,实现了多态。

22、纯虚函数

纯虚函数的一般形式是:virtual 函数类型 函数名称 = 0;
纯虚函数是没有函数体的,也就是说在基类中不需要对纯虚函数进行定义,最后面的“=0”并不是表示函数的返回值是0,而是说明该虚函数是纯虚函数,它不具备函数的功能,只是为了派生类的特殊功能调用保留函数的名称。如果一个类中声明了纯虚函数,而在派生类却没有重新对该函数进行定义,则纯虚函数在派生类中仍然为纯虚函数。

23、内联函数

用关键字inline修饰的函数就是内联函数。关键字在函数声明和定义时都要加上。与一般函数被调用时是通过指令跳转到调用函数入口地址不同,内联函数是直接复制“镶嵌”到主函数中去,即将内联函数的代码直接放在内联函数的位置上。当函数本身内容比较少,代码比较短,功能比较简单或是被调用的频繁时可以使用内联函数。另,递归函数不能使用内联函数。

24、类的静态变量

将类成员定义为静态类成员,则允许使用类名直接访问。静态类成员是在类成员定义前使用static关键字标识。在定义静态数据成员时,通常需要在类外对静态数据成员进行初始化。对于静态成员来说,不仅可以通过对象访问,还可以直接使用类名访问。在一个类中,静态数据成员是被所有的类对象所共享的。这意味着无论定义多少个类对象,类的静态数据成员只有一份。同时,如果某一个对象修改了静态数据成员,其他对象的静态数据成员也将改变。

25、无法修改数据成员的方法

既要使数据能在一定范围内共享,又可以保证数据不被随意修改,这时可以使用const修饰符,即把有关的成员声明为常量。不能在构造函数的定义中为常成员变量赋初始值,只能通过构造函数的参数初始化表对常成员变量进行初始化。
const加在函数名和括号后是声明为常成员函数,常成员函数只能引用本类中的成员变量,而不能对成员变量进行修改。

26、捕获程序中的错误

在C++语言中,为了处理异常,提供了try和catch语句,try语句块包含的是可能产生异常的代码,catch语句块包含的是处理异常的代码。在try程序段后,必须紧跟一个或多个catch程序段。每个catch程序段用于捕获一种类型的异常,并列的catch程序之间不许插入其他语句。

27、delete与delete[]区别

对于简单的数据类型,其对象没有析构函数,因此delete和delete[]是一样的,但是对于动态分配数据的数据类型不同,delete[]在释放数组空间前对数组中每一个对象调用析构函数,而delete则仅仅释放指针所指的空间。

28、生成随机数

int random = rand();但这样生成的随机数范围太大,如果想要生成的随机数范围在0-99,可以采用int random = rand()%100;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值