随笔分类 - C++语法
摘要:拷贝构造函数在下面三种情况下被调用:拷贝初始化,如:A b(a);赋值初始化:如:A b = a;函数传形参:如:foo(A a)赋值运算只有一种情况会被调用:非初始化的赋值:如:A b; b = a;代码: 1 #include 2 #include 3 4 /*** 5 * @author:zanzan101 6 */ 7 8 inline void P(const char* str) 9 {10 printf("%s\n", str);11 }12 13 class A14 {15 private: 16 int _data;17 char* _name...
        阅读全文
            
摘要:通过上一篇文章,我在分析继承过程中对象的数据结构时,意外发现可以通过地址随意的访问对象的数据,无论是私有的还是公开的。于是做了以下实验,通过实验可以看出来,内存中的数据,只要不是在常量区,只要你能获得目标的地址,你就可以修改它,无论是在const函数中,还是某类的私有成员变量。代码: 1 #include 2 3 /*** 4 * @author:zanzan101 5 */ 6 7 // 测试如何在const函数中修改成员变量 8 class A 9 {10 private:11 int data1;12 int data2;13 public:14 A(): ...
        阅读全文
            
摘要:多重继承:非虚函数,两个基类存在满足覆盖条件的函数时,派生类无法调用其中任何一个函数。该条件只有一个要求:重名。无论返回值、参数、const类型如何,只要重名,即满足覆盖条件。虚继承:伴随虚继承衍生出来了虚基类的概念,当一个B虚继承了A时,A就是B的虚基类,虚基类的概念只存在于虚继承关系两个类之间,当此时C正常继承A时,A相对于C就不是虚基类。无论虚继承还是虚基类,都与虚函数无关。使用虚继承时,两个中间类都必须是虚继承于最基类,否则无论虚函数还是非虚函数,都会产生两份函数。正常使用方法:两个中间类虚继承与最基类,之后最派生类正常继承于两个中间类;两个中间类必须保证不同时覆盖某个虚函数或同时覆盖
        阅读全文
            
摘要:虚函数:覆盖的条件:同名 && 同参 && 同返回值 && 同const类型重载的条件:同名 && (不同参 || 不同const类型)非法的条件:同名 && 同参 && 不同返回值类型非虚函数:覆盖的条件:同名重载的条件:不能重载基类的函数,一旦同名,就会覆盖基类的函数,但是可以平级重载注意:覆盖只能发生在继承过程中,不是继承不能覆盖,出现非法重定义的错误。代码: 1 #include 2 3 /*** 4 * @author:zanzan101 5 */ 6 7 class A 8 { 9 pu
        阅读全文
            
摘要:写了一小段代码:练习一下友元类和友元函数的声明和使用;练习一下最简单的快排算法;练习一下递归的方法处理全排列问题。代码: 1 #include 2 #include 3 4 class Something; 5 6 // 友元函数可以提前在类外定义,也可以不这么做 7 int get_data(Something& sth); 8 9 class Otherthing; 10 class Something 11 { 12 private: 13 int data; 14 15 // 友元类定义的位置在private,public,protecte...
        阅读全文
            
摘要:MBSC: multibytes charset,多字节字符集:半角字符占一个字节,全角字符占两个字节;USC:unicode charset,Unicode字符集:所有字符无论中英还是全角半角,都是每个字符占两个字节;他们之间的相互转换在win32程序中,用WideCharToMultiByte和MultiByteToWideChar两个函数。代码: 1 #include 2 #include 3 4 #include 5 6 /*** 7 * @author:zanzan101 8 */ 9 10 using namespace std; 11 12 voi...
        阅读全文
            
摘要:1 构造函数不能是虚函数2 当析构函数不是虚函数时:父指针子对象时:构造是父—>子,析构是父;3 当析构函数不是虚函数时:子指针子对象时:构造是父—>子,析构是子—>父;4 当析构函数是虚函数时:父指针子对象时:构造是父—>子,析构是子—>父;5 构造和析构函数中的虚函数都不能触发多态行为。代码: 1 #include 2 3 /** 4 * @author:zanzan101 5 */ 6 class A 7 { 8 public: 9 A(){10 printf("Ac\n");11 todo();12 }13 virtual ~...
        阅读全文
            
摘要:该说的都在代码及注释中。练习代码: 1 #include 2 #include 3 4 /** 5 * @author:zanzan101 6 */ 7 8 // 这里的参数声明时: 9 // int** arr 调用时错误! 10 // int arr[][] 声明时错误! 11 // int arr[][1] 调用时错误! 12 // 唯一要求准确的条件是一维空间的长度,即需要知道列数,不需要知道行数,需要知道行的长度 13 int sum_array(int arr[][5]) 14 { 15 int sum = 0; 16 for(int i ...
        阅读全文
            
摘要:之前没有注意到的一些关键字,比如WINAPI,CALLBACK,原来是这个__stdcall的意思,而如果不声明__stdcall的话,就按默认的__cdecl处理,而这两者是不能相互转化的。具体原因,看代码吧。代码: 1 #include 2 #include 3 4 /** 5 * @author:zanzan101 6 */ 7 8 // 默认的情况,就是__cdecl类型的函数调用方式 9 void func()10 {11 printf("func\n");12 return;13 }14 15 void __cdecl func_cdecl()16 {17 ..
        阅读全文
            
摘要:C++的四种类型转换的练习代码,该说的都在注释中,培养大家看代码的耐心~~代码: 1 #include 2 #include 3 4 /** 5 * @author:zanzan101 6 */ 7 8 using namespace std; 9 10 class A 11 { 12 private: 13 int data; 14 15 // 小知识:引用可以出现在类中,它的初始化和const类型类似,都是必须放到初始化列表中 16 int& ref; 17 public: 18 19 // 小知识:初始化列表中初始化的顺序,...
        阅读全文
            
摘要:练习代码,该说的都在代码和注释里: 1 #include 2 3 class BaseClass 4 { 5 private: 6 int pri; 7 protected: 8 int pro; 9 public: 10 int pub; 11 12 BaseClass() 13 { 14 printf("调用父类的构造函数!\n"); 15 to_string(); 16 } 17 18 // 将析构函数设置为虚函数,以便在应用多态特征的时候,能够调用子类的析构函数释放子类动...
        阅读全文
            
摘要:上代码,该说的都在代码及注释里: 1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 class BaseClass 8 { 9 protected: 10 // 普通变量 11 int data; 12 13 // 地址不可变,但内容可变的常量 14 // 必须在初始值设定项列表中初始化 15 char* const name; 16 private: 17 18 // 内容不可变常量 19 // 必须初始值设定项列表中初始化 20 ...
        阅读全文
            
摘要:练习代码: 1 #include 2 #include 3 4 class Something 5 { 6 private: 7 char* name; 8 int weight; 9 public: 10 Something(){ 11 printf("调用了无参构造函数!\n"); 12 weight = 0; 13 name = NULL; 14 } 15 Something(int w, const char* str = NULL) 16 { 17...
        阅读全文
            
摘要:可以看出来,32位有符号整数可表示的最大数大于20亿,32位无符号整数可表示的最大数大于40亿,因此,碰上十几亿的海量数据处理时,不要慌~~ 1 // 在32位系统中 2 // int的范围是[-2147483648,2147483647] 3 // unsigned int的范围是[0,4294967295] 4 const unsigned int min_uint = 0; 5 const unsigned int max_uint = 4294967295; 6 const int min_int = -(int)2147483648; 7 const int max_int = (i
        阅读全文
            
摘要:1、面向对象的三大特点: (1)封装:把客观事物封装成抽象类,达到“属性和方法的集和性”和“信息隐蔽性”; (2)继承:派生类可以继承基类的属性和方法; (3)多态:主要体现在函数覆盖上,覆盖是针对虚函数。C++代码练习: 1 #include 2 #include 3 4 #pragma pack(1) 5 6 ////////////////////////////////////////////////////////////////////////// 7 // 面向对象三大特征之一:封装 8 // 方法和属性包装成一个整体,并且具有信息隐蔽性 9 cl...
        阅读全文
            
摘要:1 #define N 32 #define Y(n) ((N+1)*n)3 z = 2*(N+Y(5+1));4 //z == 48易错,难点在于:理解宏函数的参数是表达式的话,不进行计算,而是直接带入,就地展开,重新分析运算符的优先级。z = 2*(3 + (3+1)*5+1)
        阅读全文
            
摘要:1、指针可以指向空:int* ptr = null;//合法2、引用必须指向一个确实存在的元素,引用在初始化的时候必须赋予初值,而指针可以不赋予初值:int& n; //不合法,必须赋予初值int* ptr; //合法3、当引用指向的对象是局部变量时: 1 int& get_reference_of_tmp() 2 { 3 int num = 123; 4 int& n = num; 5 return n; 6 } 7 void do_something() 8 { 9 int num = 321;10 }11 12 int main(int argc,...
        阅读全文
            
 
                    
                     
                    
                 
                    
                 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号