zoukankan      html  css  js  c++  java
  • C++基础类知识

    1. 默认构造,析构
    2. 拷贝构造,移动构造
    3. 拷贝赋值,移动赋值
    4. 取值
    5. 右值引用
    6. 其它
      • 基类的析构函数应使用virtual 关键字,保证子类的析构函数能够被正常调用
      • 作为接口类,如果不是基类,应该用final关键字
      1 // g++ testClass.cc -g -std=c++11 && ./a.out
      2 #include <iostream>
      3 #include <string.h>
      4 using namespace std;
      5 
      6 class MyStr final
      7 {
      8 private:
      9     char *name = NULL;
     10     int id;
     11     inline void MyStrncpy(char *dst, const char *src, size_t len) {
     12         if (dst != src) {
     13             strncpy(dst, src, len);
     14             dst[len] = '';
     15         }
     16     }
     17     inline void Reset() {
     18         id = 0;
     19         if (name) { 
     20             delete[] name; 
     21             name = NULL;
     22         }
     23     }
     24     inline void Clear() {
     25         id = 0;
     26         name = NULL;
     27     }
     28     inline void DeepCopy(const MyStr &other) {
     29         id = other.id;
     30         name = new char[strlen(other.name) + 1];
     31         MyStrncpy(name, other.name, strlen(other.name));        
     32     }
     33     inline void ShallowCopy(const MyStr &other) {
     34         id = other.id;
     35         name = other.name;      
     36     }
     37 public:
     38     // 默认构造函数
     39     explicit MyStr():id(0),name(NULL) {
     40         cout << "构造: " << __func__ << endl;
     41     }
     42     // 构造函数
     43     explicit MyStr(int _id, char *_name) {
     44         cout << "普通构造: " << __func__ << endl;
     45         id = _id;
     46         name = new char[strlen(_name) + 1];
     47         MyStrncpy(name, _name, strlen(_name));
     48     }
     49     // 析构函数
     50     ~MyStr() {
     51         cout << "析构: " << __func__ << endl;
     52         Reset();
     53     }
     54     // 拷贝构造
     55     MyStr(const MyStr& other) {
     56         cout << "拷贝构造: " << __func__ << endl;
     57         DeepCopy(other);
     58     }
     59     // 移动构造
     60     MyStr(MyStr &&other) {
     61         cout << "移动构造: " << __func__ << endl;
     62         ShallowCopy(other);
     63         other.Clear();
     64     }
     65     // 拷贝赋值, rhs means right hand side value
     66     MyStr &operator=(const MyStr &rhs) {
     67         cout << "拷贝赋值: " << __func__ << endl;
     68         if (this != &rhs) {
     69             Reset();
     70             DeepCopy(rhs);
     71         }
     72         return *this;
     73     }
     74     // 移动赋值
     75     MyStr &operator=(MyStr &&rhs) {
     76         cout << "移动赋值: " << __func__ << endl;
     77         if (this != &rhs) {
     78             Reset();
     79             ShallowCopy(rhs);
     80             rhs.Clear();
     81         }
     82         return *this;
     83     }
     84 };
     85 
     86 int main()
     87 {
     88     cout << "普通构造====================" << endl;
     89     MyStr str1(1, (char*)"aaa");
     90     cout << "普通构造====================" << endl;
     91     MyStr str2(2, (char*)"bbbb");
     92     cout << "拷贝赋值====================" << endl;
     93     str2 = str1;
     94     cout << "拷贝构造====================" << endl;
     95     MyStr str3 = str2;
     96     cout << "拷贝构造====================" << endl;
     97     MyStr str4(str2);
     98     cout << "移动构造====================" << endl;
     99     MyStr str5(std::move(str2));
    100     cout << "移动构造====================" << endl;
    101     MyStr str6 = std::move(str5);
    102     cout << "普通构造====================" << endl;
    103     MyStr str7(3, (char*)"ccccc");
    104     cout << "移动赋值====================" << endl;
    105     str7 = std::move(str6);
    106     return 0;
    107 }
  • 相关阅读:
    记录一次servlet页面无法跳转的血的教训
    1862-your password has expired. To log in you must change it using a client that supports expired passwords.问题解决
    Error starting static Resources java.lang.IllegalArgumentException: Document base D:eclipse*wtpwebapps* does not exist or is not a readable directory问题的解决
    MapReduce Shuffle过程的简单理解
    MapReduce实验03——排序
    zachman架构
    大型高并发与高可用缓存架构总结2
    金蝶SOA案例分析
    感悟:菜鸟弹性调度系统的架构设计
    大型高并发与高可用缓存架构总结
  • 原文地址:https://www.cnblogs.com/zengjianrong/p/13573912.html
Copyright © 2011-2022 走看看