• 剑指offer 读书笔记一


    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] = '';
     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:
    ");
     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.
    ", text);
     95 
     96     printf("The actual result is: ");
     97     str2.Print();
     98     printf(".
    ");
     99 }
    100 
    101 void Test2()
    102 {
    103     printf("Test2 begins:
    ");
    104 
    105     char* text = "Hello world";
    106 
    107     CMyString str1(text);
    108     str1 = str1;
    109 
    110     printf("The expected result is: %s.
    ", text);
    111 
    112     printf("The actual result is: ");
    113     str1.Print();
    114     printf(".
    ");
    115 }
    116 
    117 void Test3()
    118 {
    119     printf("Test3 begins:
    ");
    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.
    ", text);
    128 
    129     printf("The actual result is: ");
    130     str2.Print();
    131     printf(".
    ");
    132 
    133     printf("The expected result is: %s.
    ", text);
    134 
    135     printf("The actual result is: ");
    136     str3.Print();
    137     printf(".
    ");
    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 是声明的一个常量指针,编译器会将他们指向同一块内存地址,所以它们是相等的。

  • 相关阅读:
    Jungle Roads POJ 1251
    Light OJ 1234 Harmonic Number
    同余定理
    HDU---1052---田忌赛马
    田忌赛马---空手道俱乐部
    poj---1182---食物链
    Convenient Location(最短路之弗洛伊德)
    js动画实现透明度动画
    js动画实现侧边栏分享
    AngularJS 指令(使浏览器认识自己定义的标签)
  • 原文地址:https://www.cnblogs.com/jjxxjnzy/p/3446624.html
Copyright © 2020-2023  润新知