学C++时作的笔记

来源:互联网 发布:整人剃发软件 编辑:程序博客网 时间:2024/06/05 03:39

老早时学C++时作的笔记,整理磁盘的时候发现的,都快成古董了,贴出来,或者还能发挥点价值:

 

 

根据经验,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。

 

如果在基类中已经定义的一个虚函数,那么在派生类中声明同样的虚函数时可以不用virtual关键字。

 

一个派生类中可以选择性的实现基类的任意的虚函数,由编译器来保证各类中相同的虚函数在表中有相同的偏移。

  

    int n1,&n2=n1;

        

    printf("%d \n",&n1);

 

    printf("%d \n",&n2);

 

 

从生成的二进制代码来看,上述代码完全以以下的代码等价:

 

    int n1,*n2=&n1;

        

    printf("%d \n",&n1);

 

    printf("%d \n",n2);

 

 

 

输出的都是n1所在的地址。通过反汇编可以知道,引用与指针是很相似的,但是引用却可以避免对空指针进行操作这样的错误。因为引用所代表的一定是一个有效的地址。

 

 

对于类的全局变量,则编译器在编译的时候将为每个全局变量生成一个初始化全局变量的函数,然后将所有的初始化全局变量的函数地址保存到一个叫CRT$XCU的段中,再通过自动生成的代码来调用保存在这个段中的所有函数,从而初始化所有的类变量。

 

MS C++编译器中,ecx用于存放this指针,也就是类的基址。

 

如果类中包含了需要动态内存分配的变量,则必须重新实现赋值操作符和拷贝构造函数。

 

每个类默认都含有一个拷贝构造函数和赋值操作符,如果类中没有声明,则编译器会自动生成一个。

 

现在想来也惭愧,想当初,只知道一点点C++的继承和虚函数,就敢用C++来写程序,真的是不知天高地厚,其结果是可想而知的:出现了bug但是却一直找不着是什么原因,实际上就是对C++不了解造成的。最常见的如拷贝构造函数和赋值操作符,如果不会用,那么在程序设计的时候简直是灾难,老是以C的思想来写C++程序,其结果是很可怕的。C++隐藏了太多的东西以至于C++的学习虚线明显的要比C的长。但是有一点是不变的,那就是首先要问how,然后再问why,这样的学习方式才是正道。

 

拷贝构造函数在函数的返回值上也是经常要用到的。如要返回一个定义成局部变量的类,则实际上也是使用了拷贝构造函数的。

 

引用使用的几个规则:

1、 在返回类型为引用时,不要返回局部变量的引用,如果确实要返回局部变量的值,则返回类型一定不能是引用。

 

C++是如何从函数返回一个类的实例的。

 

众所周知,返回值一个般是保存在寄存器中的,更具体的说,是保存在eax寄存器中,那么对于一个类的实例来说,则其成员变量不可能都放在了eax寄存器里,那么是怎么返回的呢,答案是编译器将生成一个类的实例,并将this指针作为一个参数传递给函数,调用拷贝构造函数将结果拷贝给编译器生成的类中,在返回时再返回this指针,并且如果有赋值的话再调用重载操作符来进行赋值。

 

operator=中检查给自己赋值的情况

原因:1、效率

2、 防止对释放的内存进行操作,最常出现的错误就像是释放一个字符串所占的内存后再申请一块新内存后再将原字符串拷贝到新内存中去。

 

 

Shifting from C to C++

1. Prefer const and inline to #define

2. Prefer <iostream> to <stdio.h>

3. Prefer new and delete to malloc and free

4. Prefer C++ stype comments

Memory Management

5. Use the same form in corresponding uses of new and delete

6. Use delete on pointer members in destructors

7. Be prepared for out-of memory conditions

8. Adhere to convention when writing operator new and operator delete

9. Avoid hiding the “normal” form of new

10. Write operator delete if you write operator new

Constructors,Destructors,and Assignment Operators

11. Declare a copy constructor and an assignment operator for classes with dynamically allocated memory.

12. Prefer initialization to assignment in constructors

13. List members in an initialization list in the order in which they are declared.

14. Make sure base classes have virtual destructors.

i. 这样才能确保在通过基类指针删除类时析构函数被调用。

15. Have operator= return a reference to *this

16. Assign to all data members in operator=

17. Check for assignment ot self in operator=

 

Classes and Functions:Design and Declaration 

18. Strive for class interfaces that are complete and minimal

19. Differentiate among member functions,non-member functions,and friend functions

20. Avoid data members in the public interface

21. Use const whenever possible.

22. Prefer pass-by-reference to pass-by-value.

23. Don’t try to return a reference when you must return an object.

24. Choose carefully between function overloading and parameter defaulting

25. Avoid overloading on a pointer and a numberical type.

 

 

37.Never redefine an inherited nonvirtual function.

0 0
原创粉丝点击