日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++动态内存的几个简单例子

發布時間:2024/4/18 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++动态内存的几个简单例子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。