win qt 实验

来源:互联网 发布:网络不良信息的危害 编辑:程序博客网 时间:2024/06/09 18:49

关于include的<>和" "

在C程序中包含文件有以下两种方法: 
(1)用符号“<”和“>”将要包含的文件的文件名括起来。这种方法指示预处理程序到预定义的缺省路径下寻找文件。预定义的缺省路径通常是在INCLUDE环境变量中指定的,请看下例: 
INCLUDE=C:\COMPILER\INCLUDE;S:\SOURCE\HEADERS; 
对于上述INCLUDE环境变量,如果用#include语句包含文件,编译程序将首先到C:\COMPILER\INCLUDE目录下寻找文件;如果未找到,则到S:\SOURCE\HEADERS目录下继续寻找;如果还未找到,则到当前目录下继续寻找。

(2)用双引号将要包含的文件的文件名括起来。这种方法指示预处理程序先到当前目录下寻找文件,再到预定义的缺省路径下寻找文件。


explicit关键字

 C++中的explicit关键字只能用于修饰只有一个参数类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).

  1. class CxString  // 使用关键字explicit的类声明, 显示转换  
  2. {  
  3. public:  
  4.     char *_pstr;  
  5.     int _size;  
  6.     explicit CxString(int size)  
  7.     {  
  8.         _size = size;  
  9.         // 代码同上, 省略...  
  10.     }  
  11.     CxString(const char *p)  
  12.     {  
  13.         // 代码同上, 省略...  
  14.     }  
  15. };  
  16.   
  17.     // 下面是调用:  
  18.   
  19.     CxString string1(24);     // 这样是OK的  
  20.     CxString string2 = 10;    // 这样是不行的, 因为explicit关键字取消了隐式转换  
  21.     CxString string3;         // 这样是不行的, 因为没有默认构造函数  
  22.     CxString string4("aaaa"); // 这样是OK的  
  23.     CxString string5 = "bbb"// 这样也是OK的, 调用的是CxString(const char *p)  
  24.     CxString string6 = 'c';   // 这样是不行的, 其实调用的是CxString(int size), 且size等于'c'的ascii码, 但explicit关键字取消了隐式转换  
  25.     string1 = 2;              // 这样也是不行的, 因为取消了隐式转换  
  26.     string2 = 3;              // 这样也是不行的, 因为取消了隐式转换  
  27.     string3 = string1;        // 这样也是不行的, 因为取消了隐式转换, 除非类实现操作符"="的重载  
无explicit
  1. class CxString  // 没有使用explicit关键字的类声明, 即默认为隐式声明  
  2. {  
  3. public:  
  4.     char *_pstr;  
  5.     int _size;  
  6.     CxString(int size)  
  7.     {  
  8.         _size = size;                // string的预设大小  
  9.         _pstr = malloc(size + 1);    // 分配string的内存  
  10.         memset(_pstr, 0, size + 1);  
  11.     }  
  12.     CxString(const char *p)  
  13.     {  
  14.         int size = strlen(p);  
  15.         _pstr = malloc(size + 1);    // 分配string的内存  
  16.         strcpy(_pstr, p);            // 复制字符串  
  17.         _size = strlen(_pstr);  
  18.     }  
  19.     // 析构函数这里不讨论, 省略...  
  20. };  
  21.   
  22.     // 下面是调用:  
  23.   
  24.     CxString string1(24);     // 这样是OK的, 为CxString预分配24字节的大小的内存  
  25.     CxString string2 = 10;    // 这样是OK的, 为CxString预分配10字节的大小的内存  
  26.     CxString string3;         // 这样是不行的, 因为没有默认构造函数, 错误为: “CxString”: 没有合适的默认构造函数可用  
  27.     CxString string4("aaaa"); // 这样是OK的  
  28.     CxString string5 = "bbb"// 这样也是OK的, 调用的是CxString(const char *p)  
  29.     CxString string6 = 'c';   // 这样也是OK的, 其实调用的是CxString(int size), 且size等于'c'的ascii码  
  30.     string1 = 2;              // 这样也是OK的, 为CxString预分配2字节的大小的内存  
  31.     string2 = 3;              // 这样也是OK的, 为CxString预分配3字节的大小的内存  
  32.     string3 = string1;        // 这样也是OK的, 至少编译是没问题的, 但是如果析构函数里用free释放_pstr内存指针的时候可能会报错, 完整的代码必须重载运算符"=", 并在其中处理内存释放 


 ps:

explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了. 

有一个例外, 就是当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效, 此时, 当调用构造函数只传入一个参数, 等效于只有一个参数的类构造函数