1.定义一个空的类,对其sizeof 其长度为1
2.定义一个还有纯虚函数的类,在32位机器上对其sizeof获得的值为4,在64位系统上获得的值为8。c++的纯虚函数会生成一个虚函数指针
3.定义c++的拷贝构造函数只能传递引用,不能传递其他类型,负责会导致循环调用,程序崩溃。
4.典型程序,代码如下:
1 #include <iostream> 2 #include <string> 3 #include <string.h> 4 #include <stdio.h> 5 6 class CMyString 7 { 8 public: 9 CMyString(char* pData = NULL); 10 CMyString(const CMyString& str); 11 ~CMyString(void); 12 13 CMyString& operator = (const CMyString& str); 14 15 void Print(); 16 17 private: 18 char* m_pData; 19 }; 20 21 CMyString::CMyString(char *pData) 22 { 23 if(pData == NULL) 24 { 25 m_pData = new char[1]; 26 m_pData[0] = '\0'; 27 } 28 else 29 { 30 int length = strlen(pData); 31 m_pData = new char[length + 1]; 32 strcpy(m_pData, pData); 33 } 34 } 35 36 CMyString::CMyString(const CMyString &str) 37 { 38 int length = strlen(str.m_pData); 39 m_pData = new char[length + 1]; 40 strcpy(m_pData, str.m_pData); 41 } 42 43 CMyString::~CMyString() 44 { 45 delete[] m_pData; 46 } 47 48 /* 49 CMyString& CMyString::operator = (const CMyString& str) 50 { 51 if(this == &str) //此处检查是否是其本身,如贵是直接返回 52 return *this; 53 54 delete []m_pData; 55 m_pData = NULL; 56 57 m_pData = new char[strlen(str.m_pData) + 1]; //此操作方式不安全,如果分配内存失败,会出现程序崩溃 58 strcpy(m_pData, str.m_pData); 59 60 return *this; 61 }*/ 62 63 64 65 CMyString& CMyString::operator =(const CMyString& str) 66 { 67 if(this != &str) 68 { 69 CMyString str1(str); 70 71 char *tmp = str1.m_pData; //采用调用其拷贝构造函数的办法,规避其内存分配失败时的异常,应优先采用第二种办法 72 str1.m_pData = m_pData; 73 m_pData = tmp; 74 } 75 76 return *this; 77 } 78 79 void CMyString::Print() 80 { 81 printf("%s", m_pData); 82 } 83 84 void Test1() 85 { 86 printf("Test1 begins:\n"); 87 88 char* text = "Hello world"; 89 90 CMyString str1(text); 91 CMyString str2; 92 str2 = str1; 93 94 printf("The expected result is: %s.\n", text); 95 96 printf("The actual result is: "); 97 str2.Print(); 98 printf(".\n"); 99 } 100 101 void Test2() 102 { 103 printf("Test2 begins:\n"); 104 105 char* text = "Hello world"; 106 107 CMyString str1(text); 108 str1 = str1; 109 110 printf("The expected result is: %s.\n", text); 111 112 printf("The actual result is: "); 113 str1.Print(); 114 printf(".\n"); 115 } 116 117 void Test3() 118 { 119 printf("Test3 begins:\n"); 120 121 char* text = "Hello world"; 122 123 CMyString str1(text); 124 CMyString str2, str3; 125 str3 = str2 = str1; 126 127 printf("The expected result is: %s.\n", text); 128 129 printf("The actual result is: "); 130 str2.Print(); 131 printf(".\n"); 132 133 printf("The expected result is: %s.\n", text); 134 135 printf("The actual result is: "); 136 str3.Print(); 137 printf(".\n"); 138 } 139 140 int main(int argc, char* argv[]) 141 { 142 Test1(); 143 Test2(); 144 Test3(); 145 146 return 0; 147 }
5.字符数组与字符指针
1 #include <iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 8 char str1[] = "hello"; 9 char str2[] = "hello"; 10 11 if(str1 == str2) 12 { 13 cout<<"str1 == str2"<<endl; 14 } 15 else 16 { 17 cout<<"str1 != str2"<<endl; 18 } 19 20 21 char *str3 = "test"; 22 char *str4 = "test"; 23 24 if(str3 == str4) 25 { 26 cout<<"str3 == str4"<<endl; 27 } 28 else 29 { 30 cout<<"str3 != str4"<<endl; 31 } 32 33 34 }
输出结果如下:
1 /tmp $ ./string 2 str1 != str2 3 str3 == str4
在c/c++中,会为不同的字符数据开辟不同的内存空间,所以str1 和str2 位于不同的内存空间,所以它们不相等。但是str3 和str4 是声明的一个常量指针,编译器会将他们指向同一块内存地址,所以它们是相等的。