程序設(shè)計(jì)實(shí)習(xí)w1011特性_第1頁
程序設(shè)計(jì)實(shí)習(xí)w1011特性_第2頁
程序設(shè)計(jì)實(shí)習(xí)w1011特性_第3頁
程序設(shè)計(jì)實(shí)習(xí)w1011特性_第4頁
程序設(shè)計(jì)實(shí)習(xí)w1011特性_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、信息科學(xué)技術(shù)學(xué)院程序設(shè)計(jì)實(shí)習(xí)郭煒劉家瑛1信息科學(xué)技術(shù)學(xué)院程序設(shè)計(jì)實(shí)習(xí)郭煒劉家瑛C+11特性2統(tǒng)一的初始化方法int arr31, 2, 3;vector<int> iv1, 2, 3;map<int, string> mp1, "a", 2, "b"string str"Hello World"int * p = new int201,2,3;struct A int i,j; A(int m,int n):i(m),j(n) ;A func(int m,int n ) return m,n; int main

2、() A * pa = new A 3,7; 3成員變量默認(rèn)初始值class Bpublic:int m = 1234; int n;int main()B b;cout << b.m << endl;return 0;/輸出 12344auto關(guān)鍵字用于定義變量,編譯器可以自動(dòng)變量的類型auto i = 100;/ i 是 intauto p = new A(); / p 是 A *auto k = 34343LL;/ k 是 long longmap<string,int,greater<string> > mp;for( auto i =

3、mp.begin(); i != mp.end(); +i) cout << i->first << "," << i->second ;/i的類型是: map<string,int,greater<string> >:iterator5auto關(guān)鍵字class A ;A operator + ( int n,const A & a)return a;template <class T1, class T2>auto add(T1 x, T2 y) -> decltype(x

4、+ y) return x+y;auto d = add(100,1.5); / d是double d=101.5auto k = add(100,A(); / d是A類型6decltype 關(guān)鍵字求表達(dá)式的類型int i; double t;struct A double x; ; const A* a = new A();decltype(a) decltype(i)x1; / x1 is A * x2; / x2 is intdecltype(a->x)x3; / x3 is doubledecltype(a->x) x4 = t; / x4 is double&7智

5、能指針shared_ptrØØ頭文件: <memory>通過shared_ptr的構(gòu)造函數(shù),可以讓shared_ptr對(duì)象托管一個(gè)new運(yùn)算符返回的指針,寫法如下:Øshared_ptr<T> ptr(new T);/ T 可以是 int ,char, 類名等各種類型此后ptr就可以像 T* 類型的指針一樣來使用,即 *ptr 就是用new動(dòng)態(tài)分配的那個(gè)對(duì)象,而且不必操心內(nèi)存的事。Ø 多個(gè)shared_ptr對(duì)象可以同時(shí)托管一個(gè)指針,系統(tǒng)會(huì)維護(hù)一個(gè)托管計(jì)數(shù)。當(dāng)無shared_ptr托管該指針時(shí),delete該指針。Ø s

6、hared_ptr對(duì)象不能托管指向動(dòng)態(tài)分配的數(shù)組的指針,否則程序運(yùn)行會(huì)出錯(cuò)8智能指針shared_ptr#include <memory>#include <iostream> using namespace std;struct Aint n;A(int v = 0):n(v) A() cout << n << " destructor" << endl; ;int main()shared_ptr<A> sp1(new A(2); /sp1托管A(2)shared_ptr<A> sp2(

7、sp1);/sp2也托管A(2)cout << "1)" << sp1->n << "," << sp2->n << endl; /輸出1)2,2shared_ptr<A> sp3;A * p = sp1.get();/p 指向 A(2)cout << "2)" << p->n << endl;9輸出結(jié)果:1)2,22)2sp3 = sp1; /sp3也托管A(2)cout << "3)&

8、quot; << (*sp3).n << endl; /輸出 2sp1.reset();if( !sp1 )/sp1放棄托管A(2)cout << "4)sp1 is null" << endl; /會(huì)輸出A * q = new A(3); sp1.reset(q); / sp1托管qcout << "5)" << sp1->n << endl; /輸出 3shared_ptr<A> sp4(sp1); /sp4托管A(3) shared_ptr<

9、A> sp5;/sp5.reset(q); 不妥,會(huì)導(dǎo)致程序出錯(cuò)sp1.reset();/sp1放棄托管A(3)cout << "before end main" <<endl;sp4.reset();/sp1放棄托管A(3)cout << "end main" << endl;return 0; /程序結(jié)束,會(huì)delete 掉A(2)10輸出結(jié)果:1)2,22)23)24)sp1 is null5)3before end main 3 destructorend main2 destructor空指

10、針nullptr#include <memory>#include <iostream>using namespace std;int main()int* p1 = NULL; int* p2 = nullptr;shared_ptr<double> p3 = nullptr; if(p1 = p2)cout << "equal 1" <<endl; if( p3 = nullptr)cout << "equal 2" <<endl; if( p3 = p2) ; /

11、errorif( p3 = NULL)cout << "equal 4" <<endl;bool b = nullptr; / b = falseint i = nullptr; /error,nullptr不能自動(dòng)轉(zhuǎn)換成整型return 0;11去掉出錯(cuò)的語句后輸出:equal 1equal 2equal 4基于范圍的for循環(huán)#include <iostream>#include <vector> using namespace std;struct A int n; int main() A(int i):n(i) ;i

12、nt ary = 1,2,3,4,5;for(int & e: ary)e*= 10; for(int e : ary)cout << e << "," cout << endl;vector<A> st(ary,ary+5);for( auto & it: st)it.n *= 10; for( A it: st)cout << it.n << ","return 0;12輸出:10,20,30,40,50,100,200,300,400,500,和move語義右值

13、右值:一般來說,不能取地址的表達(dá)式,就是右值, 能取地址的,就是左值class A ;A & r = A(); / error , A()是無名變量,是右值A(chǔ) && r = A(); /ok, r 是右值主要目的是提高程序運(yùn)行的效率,減少需要進(jìn)行深拷貝的對(duì)象進(jìn)行深拷貝的次數(shù)。參考A7%A3c%E5%8F%B3%E5%80%BC%E5%BC%95%E7%94%A8/13#include <iostream> #include <string> #include <cstring> using namespace std;class St

14、ringpublic:char * str;String():str(new char1) str0 = 0; String(const char * s) str = new charstrlen(s)+1;strcpy(str,s);String(const String & s) cout << "copy constructor called" << endl; str = new charstrlen(s.str)+1; strcpy(str,s.str);14String & operator=(const String

15、& s) cout << "copy operator= called" << endl; if( str != s.str) delete str;str = new charstrlen(s.str)+1; strcpy(str,s.str);return * this;/ move constructor String(String && s):str(s.str) cout << "move constructor called"<<endl;s.str = new char

16、1; s.str0 = 0;15/ move assigmentString & operator = (String &&s) cout << "move operator= called"<<endl; if (str!= s.str) str = s.str;s.str = new char1;s.str0 = 0;return *this;String() delete str; ;template <class T>void MoveSwap(T& a, T& b)T tmp(move(a

17、); / std:move(a)為右值,這里會(huì)調(diào)用move constructora = move(b);/ move(b)為右值,因此這里會(huì)調(diào)用move assigmentb = move(tmp); / move(tmp)為右值,因此這里會(huì)調(diào)用move assigment16int main()/String & r = String("this"); / errorString && r = String("this");cout << r.str << endl;String s1 = "

18、hello",s2 = "world" MoveSwap(s1,s2);cout << s2.str << endl; return 0;17輸出:thismove constructor called move operator= called move operator= called helloIn-Quiz1. 下面的變量x是什么類型的(假設(shè)頭文件都已經(jīng)包含)?template <class T1, class T2>auto add(T1 x, T2 y) -> decltype(x + y) return x+

19、y;int main()auto x = add( string("hello"),"world");return 0;A)char * B)string C)int D)拜托,上面程序有語法錯(cuò)誤好不好2. struct A int n; ; shared_ptr<A> p(new A();則以下哪個(gè)表達(dá)式是沒有定義的?A)! p B)p->n; C)*p D)+p;3. 以下哪段程序沒有編譯錯(cuò)誤?A) string & r = string("this");B) string && r = string("this");C) string s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論