c++动态内存的几个简单例子
生活随笔
收集整理的這篇文章主要介紹了
c++动态内存的几个简单例子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文件functions.cc
#include <string> #include <iostream> #include <memory> #include <vector> #include "strblob.h" using namespace std; //默認構造函數的定義 StrBlob::StrBlob() = default; //構造函數的定義,參數是一個列表初始化器(也是一個模板) StrBlob::StrBlob(initializer_list<string> l1):data(make_shared<vector<string>>(l1)){} //上面這句列表初始化器initializer_list<string>不可以換成vector<string>, //實現成員函數pop_back() void StrBlob::pop_back(){ data->pop_back(); } //下面是私有成員函數的一個實現,從這個例子可以看出,不論是公有成員函數或者是私有成員函數, //都可以以同樣的方式定義在類外的一個單獨文件中. void StrBlob::check(size_type i,const string & msg)const{ //這個函數是類StrBlob的私有工具函數,它檢查一個給定索引是否在合法的范圍內。 //如果i 大于或等于data->size(),那么就是非法的,程序就會拋出一個out_of_range異常, //會打印下列消息 //terminate called after throwing an instance of 'std::out_of_range' //what(): front on empty StrBlobif(i >= data->size())throw out_of_range(msg); } // string & StrBlob::front() { check(0,"front on empty StrBlob"); return data->front(); } string & StrBlob::back() { check(0,"back on empty StrBlob"); return data->back(); } //調用vector的clear函數,清空容器 void StrBlob::clear(){ data->clear(); }文件8.cc
#include <iostream> #include <string> #include <memory> #include <vector> #include "strblob.h" using namespace std; int main() { //定義一個StrBlob對象 StrBlob s1({"str1","str2","str3","str4","str5"}); cout << s1.empty() << endl; cout << s1.size() << endl; s1.push_back("str6"); cout << s1.size() << endl; cout << s1.front() << endl; cout << s1.back() << endl; s1.clear(); cout << s1.size() << endl;return 0; }?文件strblob.h
#include <string> #include <iostream> #include <memory> #include <vector> using namespace std; class StrBlob{ public: //定義一個類型別名,用typedef typedef vector<string>::size_type size_type; //默認構造函數的申明 StrBlob(); //構造函數申明 StrBlob(initializer_list<string> l1); //成員函數size()的定義,返回智能指針data的大小 size_type size() const {return data->size();} //定義empty成員函數 bool empty()const{return data->empty();} //定義成員函數push_back void push_back(const string & t) {data->push_back(t);} //申明成員函數pop_back() void pop_back(); //申明成員函數front() string & front(); //申明成員函數back() string & back(); void clear(); private: //智能指針的申明,指向vector<string>對象 shared_ptr<vector<string>> data; //定義一個私有的check函數,檢查一個下標i是否合法,如果不合法,打印消息msg void check(size_type i,const string & msg)const; };運行結果:
0 5 6 str1 str6 0拓展知識點:
(1)類中凡是不需要改變數據成員的值得成員函數,一般都定義成const成員函數(成員函數形參列表后有const)更實用。例如:
void StrBlob::check(const size_type i,const string &msg)const{ if(i >= data->size())cout << msg << endl; }(2)check函數(私有)其實是檢驗data[i]是否合法,如果不合法,那么拋出一個異常。
(3)front()和back()兩個成員函數應該對const進行重載,如下:
string &StrBlob::front() { check(0,"front on empty container"); return data->front();} const string & StrBlob::front()const { //...check()函數自己添加 return data->front(); }string &StrBlob::back() { check(0,"back on empty container"); return data->back(); } const string &StrBlob::back()const { //...check函數自己添加 return data->back(); }注意:
1.如果某個函數需要容器的列表({“”,“”,“”})初始化參數,那么定義成initializer_list<object_name>
2.接受一個參數的構造函數如果不是explicit的,那么就可以在使用StrBlob的時候,可以從參數類型到StrBlob的一步轉換且只能進行一步.所以可以如下定義:
StrBlob s1 = {"str1","str2","str3","str4","str5"};這個定義進行了從容器列表(即initializer_list<string>類型)到StrBlob類型的轉換
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的c++动态内存的几个简单例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3 pygame的发射子弹自
- 下一篇: vim 撤销和恢复