构造函数为什么不能是虚函数
摘要:1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过
阅读全文
GetTickCount()函数
摘要:函数功能:GetTickCount返回(retrieve)从操作系统启动到现在所经过(elapsed)的毫秒数,它的返回值是DWORD。函数原型:DWORD GetTickCount(void);C/C++头文件:winbase.hwindows程序设计中可以使用头文件windows.h注意事项: GetTickcount函数:它返回从操作系统启动到当前所经过的毫秒数,常常用来判断某个方法执行的时间,其函数原型是DWORD GetTickCount(void),返回值以32位的双字类型DWORD存储,因此可以存储的最大值是2^32 ms约为49.71天,因此若系统运行时间超过49.71天时,这
阅读全文
C++输出中文字符
摘要:注:本文转载自互联网,感谢作者整理!1. cout场景1: 在源文件中定义 const char* str = "中文" 在 VC++ 编译器上,由于Windows环境用 GBK编码,所以字符串 "中文" 被保存为 GBK内码,编译器也把 str 指向一个包含有 GBK编码的只读内存空间.用 cout 输出 str 时, 由于中文Windows环境用GBK编码,所以把GBK编码的 str 内容输出到控制台,没问题.场景2: 在Linux 下编辑一个文件 const char* str = "中文", 由于Linux普遍使用 UTF8
阅读全文
C++ vector
摘要:注:转载自网络,谢谢作者整理!vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 为了可以使用vector,必须在你的头文件中包含下面的代码: #include <vector> vector属于std命名域的,因此需要通过命名限定,如下完成你的代码: using std::vector; vector<int> vInts; 或者连在一起,使用全名: std::
阅读全文
string类的构造函数
摘要:string (const char * s); 将string对象初始化为s指向的NBTSstring (size_type n,char c); 创建一个包含n个元素的string对象,其中每个元素都被初始化为字符cstring (const char * s,size_type n); 将string对象初始化为s指向的前n个字符,即使超过了NBTS的结尾string (const string & str,size_tpye n=npos); 将string对象初始化为对象str中从位置pos开始到结尾的字符,或从位置pos开始的n个字符string (); 创建一个默认的st
阅读全文
dynamic_cast
摘要:注:转载,谢谢作者整理dynamic_cast <new_type> (expression)dynamic_cast运算符,应该算是四个里面最特殊的一个,因为它涉及到编译器的属性设置,而且牵扯到的面向对象的多态性跟程序运行时的状态也有关系,所以不能完全的使用传统的转换方式来替代。但是也因此它是最常用,最不可缺少的一个运算符。与static_cast一样,dynamic_cast的转换也需要目标类型和源对象有一定的关系:继承关系。 更准确的说,dynamic_cast是用来检查两者是否有继承关系。因此该运算符实际上只接受基于类对象的指针和引用的类转换。从这个方面来看,似乎dynam
阅读全文
关于继承方式和访问权限
摘要:注:本文摘自unixfy博文,感谢作者整理!关于访问控制权限和继承方式关于访问权限和继承方式访问权限有三种:public、protected、private继承也有三种:public、protected、private,这里不考虑 virtual 继承。继承时的权限,不是针对本类内的访问权限,而是针对该派生类的客户端代码(包括其派生类)的访问权限。即是,对于基类中的 public、protected 成员,如果一个派生类 private 继承自该基类,则这些成员还是可以在派生类中访问的,只是不能在该派生类的客户代码中被直接访问,或者在该派生类的派生类中直接访问。也就是说,继承的方式是针对派生类
阅读全文
C++类中的枚举类型
摘要:注:本文来自于WebTrip博文,感谢作者整理。《高质量程序设计指南》5.4节 类中的常量 有时我们希望某些常量只在类中有效。 由于#define 定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用 const 修饰数据成员来实现。const 数据成员的确是存在的,但其含义却不是我们所期望的。const 数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其 const 数据成员的值可以不同。 不能在类声明中初始化 const 数据成员。以下用法是错误的,因为类的对象未被创建时,编译器不知道 SIZE 的值是什么。classA{consti
阅读全文
C++析构函数为什么要为虚函数
摘要:注:本文内容来源于zhice163博文,感谢作者的整理。1.为什么基类的析构函数是虚函数? 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。 下面转自网络:源地址http://blog.sina.com.cn/s/blog_7c773cc50100y9hz.html a.第一段代码 #include<iostream>using namespace std;class ClxBase{public: ClxBase() {}; ~ClxBase() {cout << "Output from the destructor of
阅读全文