Khiêu chuyển chí

Tân bản C++ đặc tính

Chú ý:Khảo lự đáo toán pháp cạnh tái đích thật tế tình huống, bổn văn tương bất hội toàn diện nghiên cứu ngữ pháp, chỉ hội giảng thuật tại toán pháp cạnh tái trung khả năng hội ứng dụng đáo đích bộ phân.

Bổn văn ngữ pháp tham chiếuC++11Tiêu chuẩn. Ngữ nghĩa bất đồng đích tương dĩC++11Tác vi tiêu chuẩn, C++14, C++17 đích ngữ pháp thị tình huống đề cập tịnh hội đặc biệt tiêu chú.

autoLoại hình thuyết minh phù

autoLoại hình thuyết minh phù dụng vu tự động thôi đạo biến lượng đẳng đích loại hình. Lệ như:

1
2
autoa=1;// a thị int loại hình
autob=a+0.1;// b thị double loại hình

Cơ vu phạm vi đíchforTuần hoàn

Hạ diện thịC++20 tiềnCơ vu phạm vi đíchforTuần hoàn đích ngữ pháp:

1
for(range_declaration:range_expression)loop_statement

Thượng thuật ngữ pháp sản sinh đích đại mã đẳng giới vu hạ liệt đại mã (__range,__beginHòa__endCận dụng vu xiển thích ):

1
2
3
4
5
auto&&__range=range_expression;
for(auto__begin=begin_expr,__end=end_expr;__begin!=__end;++__begin){
range_declaration=*__begin;
loop_statement
}

range_declaration phạm vi thanh minh

Phạm vi thanh minh thị nhất cá cụ danh biến lượng đích thanh minh, kỳ loại hình thị do phạm vi biểu đạt thức sở biểu kỳ đích tự liệt đích nguyên tố đích loại hình, hoặc cai loại hình đích dẫn dụng. Thông thường dụngautoThuyết minh phù tiến hành tự động loại hình thôi đạo.

range_expression phạm vi biểu đạt thức

Phạm vi biểu đạt thức thị nhậm hà khả dĩ biểu kỳ nhất cá hợp thích đích tự liệt ( sổ tổ, hoặc định nghĩa liễubeginHòaendThành viên hàm sổ hoặc tự do hàm sổ đích đối tượng ) đích biểu đạt thức, hoặc nhất cá hoa quát hào sơ thủy hóa khí liệt biểu. Chính nhân thử, ngã môn bất ứng tại tuần hoàn thể trung tu cải phạm vi biểu đạt thức sử kỳ nhậm hà thượng vị bị biến lịch đáo đích “Điệt đại khí” ( bao quát “Vĩ hậu điệt đại khí” ) phi pháp hóa.

Giá lí hữu nhất cá lệ tử:

1
for(inti:{1,1,4,5,1,4})std::couti;

loop_statement tuần hoàn ngữ cú

Tuần hoàn ngữ cú khả dĩ thị nhậm hà ngữ cú, thường vi nhất điều phục hợp ngữ cú, tha thị tuần hoàn thể.

Giá lí hữu nhất cá lệ tử:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include&LTiostream>

structC{
inta,b,c,d;

C(inta=0,intb=0,intc=0,intd=0):a(a),b(b),c(c),d(d){}
};

int*begin(C&p){return&p.a;}

int*end(C&p){return&p.d+1;}

intmain(){
Cn=C(1,9,2,6);
for(autoi:n)std::couti"";
std::coutstd::endl;
// hạ diện đích tuần hoàn dữ thượng diện đích tuần hoàn đẳng giới
auto&&__range=n;
for(auto__begin=begin(n),__end=end(n);__begin!=__end;++__begin){
autoind=*__begin;
std::coutind"";
}
std::coutstd::endl;
return0;
}

Lambda biểu đạt thức

Tường kiếnLambda biểu đạt thứcHiệt diện.

decltype thuyết minh phù

decltypeThuyết minh phù khả dĩ thôi đoạn biểu đạt thức đích loại hình.

1
2
3
4
5
6
7
8
9
10
#include&LTiostream>
#include&LTvector>

intmain(){
inta=1926;
decltype(a)b=a/2-146;// b thị int loại hình
std::vectordecltype(b)>vec={0};// vec thị std::vector &LTint> loại hình
std::coutavec[0]bstd::endl;
return0;
}

constexpr

Lánh thỉnh tham duyệtThường trị: Thường biểu đạt thức constexpr ( C++11 )

constexprThuyết minh phù thanh minh khả dĩ tại biên dịch thời cầu đắc hàm sổ hoặc biến lượng đích trị. Kỳ dữconstĐích chủ yếu khu biệt thị nhất định hội tại biên dịch thời tiến hành sơ thủy hóa. Dụng vu đối tượng thanh minh đíchconstexprThuyết minh phù uẩn hàmconst,Dụng vu hàm sổ thanh minh đíchconstexprUẩn hàminline.Lai khán nhất cá lệ tử

1
2
3
4
5
6
intfact(intx){returnx?x*fact(x-1):1;}

intmain(){
constexprinta=fact(5);// ERROR: Hàm sổ điều dụng tại thường lượng biểu đạt thức trung tất tu cụ hữu thường lượng trị
return0;
}

Tạiint fact(int x)Chi tiền gia thượngconstexprTắc biên dịch thông quá.

std::tuple

std::tupleĐịnh nghĩa vu đầu văn kiện&LTtuple>,Thị cố định đại tiểu đích dị loại trị hối tập ( tại xác định sơ thủy nguyên tố hậu bất năng canh cải, đãn thị sơ thủy nguyên tố năng hữu nhậm ý đa cá ). Tha thịstd::pairĐích thôi quảng. Lai khán nhất cá lệ tử:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include&LTiostream>
#include&LTtuple>
#include&LTvector>

constexprautoexpr=1+1*4-5-1+4;

intmain(){
std::vectorint>vec={1,9,2,6,0};
std::tupleint,int,std::string,std::vectorint>>tup=
std::make_tuple(817,114,"514",vec);
std::coutstd::tuple_sizedecltype(tup)>::valuestd::endl;

for(autoi:std::getexpr>(tup))std::couti"";
// std::get trung tiêm quát hào lí diện đích tất tu thị chỉnh hình thường lượng biểu đạt thức
// expr thường lượng đích trị thị 3, chú ý std::tuple đích thủ nguyên tố biên hào vi 0,
// cố ngã môn std::get đáo liễu nhất cá std::vector&LTint>
return0;
}

Thành viên hàm sổ

Hàm sổTác dụng
operator=Phú trị nhất cátupleĐích nội dung cấp lánh nhất cá
swapGiao hoán nhị cátupleĐích nội dung

Lệ tử

1
2
3
4
constexprstd::tupleint,int>tup={1,2};
std::tupleint,int>tupA={2,3},tupB;
tupB=tup;
tupB.swap(tupA);

Phi thành viên hàm sổ

Hàm sổTác dụng
make_tupleSang kiến nhất cátupleĐối tượng, kỳ loại hình căn cư các thật tham loại hình định nghĩa
std::getNguyên tổ thức phóng vấn chỉ định đích nguyên tố
operator==ĐẳngÁn tự điển thuận tự bỉ giáctupleTrung đích trị
std::swapĐặc hóa đíchstd::swapToán pháp

Lệ tử

1
2
3
4
std::tupleint,int>tupA={2,3},tupB;
tupB=std::make_tuple(1,2);
std::swap(tupA,tupB);
std::coutstd::get1>(tupA)std::endl;

std::function

Loại mô bảnstd::functionThị thông dụng đa thái hàm sổ phong trang khí, định nghĩa vu đầu văn kiện&LTfunctional>.std::functionĐích thật lệ năng tồn trữ, phục chế cập điều dụng nhậm hà khả điều dụng (Callable) mục tiêu —— hàm sổ, Lambda biểu đạt thức hoặc kỳ tha hàm sổ đối tượng, hoàn hữu chỉ hướng thành viên hàm sổ chỉ châm hòa chỉ hướng sổ cư thành viên chỉ châm.

Tồn trữ đích khả điều dụng đối tượng bị xưng vistd::functionĐíchMục tiêu.Nhượcstd::functionBất hàm mục tiêu, tắc xưng tha viKhông.Điều dụng khôngstd::functionĐích mục tiêu tương đạo trí phao xuấtstd::bad_function_callDị thường.

Lai khán lệ tử

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include&LTfunctional>
#include&LTiostream>

structFoo{
Foo(intnum):num_(num){}

voidprint_add(inti)const{std::coutnum_+i'\n';}

intnum_;
};

voidprint_num(inti){std::couti'\n';}

structPrintNum{
voidoperator()(inti)const{std::couti'\n';}
};

intmain(){
// tồn trữ tự do hàm sổ
std::functionvoid(int)>f_display=print_num;
f_display(-9);

// tồn trữ Lambda
std::functionvoid()>f_display_42=[](){print_num(42);};
f_display_42();

// tồn trữ đáo thành viên hàm sổ đích điều dụng
std::functionvoid(constFoo&,int)>f_add_display=&Foo::print_add;
constFoofoo(314159);
f_add_display(foo,1);
f_add_display(314159,1);

// tồn trữ đáo sổ cư thành viên phóng vấn khí đích điều dụng
std::functionint(Fooconst&)>f_num=&Foo::num_;
std::cout"num_:"f_num(foo)'\n';

// tồn trữ đáo hàm sổ đối tượng đích điều dụng
std::functionvoid(int)>f_display_obj=PrintNum();
f_display_obj(18);
}

Khả biến tham sổ hoành

Khả biến tham sổ hoành thị C99 dẫn nhập đích nhất cá đặc tính, C++ tòng C++11 khai thủy chi trì giá nhất đặc tính. Khả biến tham sổ hoành duẫn hứa hoành định nghĩa khả dĩ ủng hữu khả biến tham sổ, lệ như:

1
#define def_name(...) def_body(__VA_ARGS__)

Kỳ trung,...Thị khuyết tỉnh phù hào,__VA_ARGS__Tại điều dụng thời hội thế hoán thành thật tế đích tham sổ liệt biểu,def_bodyỨng vi khả biến tham sổ mô bản hàm sổ.

Hiện tại tựu khả dĩ giá ma điều dụngdef_name:

1
2
3
4
def_name();
def_name(1);
def_name(1,2,3);
def_name(1,0.0,"abc");

Khả biến tham sổ mô bản

Tại C++11 chi tiền, loại mô bản hòa hàm sổ mô bản đô chỉ năng tiếp thụ cố định sổ mục đích mô bản tham sổ. C++11 duẫn hứaNhậm ý cá sổ, nhậm ý loại hìnhĐích mô bản tham sổ.

Khả biến tham sổ mô bản loại

Lệ như, hạ liệt đại mã thanh minh đích mô bản loạitupleĐích đối tượng khả dĩ tiếp thụ nhậm ý cá sổ, nhậm ý loại hình đích mô bản tham sổ tác vi tha đích mô bản hình tham.

1
2
templatetypename...Values>
classTuple{};

Kỳ trung,ValuesThị nhất cá mô bản tham sổ bao, biểu kỳ 0 cá hoặc đa cá ngạch ngoại đích loại hình tham sổ. Mô bản loại chỉ năng hàm hữu nhất cá mô bản tham sổ bao, thả mô bản tham sổ bao tất tu vị vu sở hữu mô bản tham sổ đích tối hữu trắc.

Sở dĩ, khả dĩ giá ma thanh minhtupleĐích đối tượng:

1
2
3
4
Tupletest0;
Tupleint>test1;
Tupleint,int,int>test2;
Tupleint,std::vectorint>,std::mapstd::string,std::vectorint>>>test3;

Như quả yếu hạn chế chí thiếu hữu nhất cá mô bản tham sổ, khả dĩ giá ma định nghĩa mô bản loạituple:

1
2
templatetypenameFirst,typename...Rest>
classTuple{};

Khả biến tham sổ mô bản hàm sổ

Đồng dạng đích, hạ liệt đại mã thanh minh đích mô bản hàm sổfunKhả dĩ tiếp thụ nhậm ý cá sổ, nhậm ý loại hình đích mô bản tham sổ tác vi tha đích mô bản hình tham.

1
2
templatetypename...Values>
voidfun(Values...values){}

Kỳ trung,ValuesThị nhất cá mô bản tham sổ bao,valuesThị nhất cá hàm sổ tham sổ bao, biểu kỳ 0 cá hoặc đa cá hàm sổ tham sổ. Mô bản hàm sổ chỉ năng hàm hữu nhất cá mô bản tham sổ bao, thả mô bản tham sổ bao tất tu vị vu sở hữu mô bản tham sổ đích tối hữu trắc.

Sở dĩ, khả dĩ giá ma điều dụngfunHàm sổ:

1
2
3
4
fun();
fun(1);
fun(1,2,3);
fun(1,0.0,"abc");

Tham sổ bao triển khai

Chi tiền thuyết diện liễu như hà thanh minh mô bản loại hoặc giả mô bản hàm sổ, đãn thị cụ thể chẩm ma sử dụng truyện tiến lai đích tham sổ ni? Giá cá thời hầu tựu nhu yếu tham sổ bao triển khai.

Đối vu mô bản hàm sổ nhi ngôn, tham sổ bao triển khai đích phương thức hữu đệ quy hàm sổ phương thức triển khai dĩ cập đậu hào biểu đạt thức hòa tham sổ liệt biểu phương thức triển khai.

Đối vu mô bản loại nhi ngôn, tham sổ bao triển khai đích phương thức hữu mô bản đệ quy phương thức triển khai hòa kế thừa phương thức triển khai.

Đệ quy hàm sổ phương thức triển khai tham sổ bao

Đệ quy hàm sổ phương thức triển khai tham sổ bao nhu yếu đề cung triển khai tham sổ bao đích đệ quy hàm sổ hòa tham sổ bao triển khai đích chung chỉ hàm sổ.

Cử cá lệ tử, hạ diện giá cá đại mã đoạn sử dụng liễu đệ quy hàm sổ phương thức triển khai tham sổ bao, thật hiện liễu khả tiếp thụ đại vu đẳng vu 2 cá tham sổ đích thủ tối đại trị hàm sổ.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// đệ quy chung chỉ hàm sổ, khả dĩ thị 0 hoặc đa cá tham sổ.
templatetypenameT>
TMAX(Ta,Tb){
returna>b?a:b;
}

// triển khai tham sổ bao đích đệ quy hàm sổ
templatetypenameFirst,typename...Rest>
FirstMAX(Firstfirst,Rest...rest){
returnMAX(first,MAX(rest...));
}

// int a = MAX(1); // biên dịch bất thông quá, đãn thị đối 1 cá tham sổ thủ tối đại trị bổn thân dã một hữu ý nghĩa
// int b = MAX(1, "abc" ); //
// biên dịch bất thông quá, đãn thị tại chỉnh sổ hòa tự phù xuyến gian thủ tối đại trị bổn thân dã một hữu ý nghĩa
intc=MAX(1,233);// 233
intd=MAX(1,233,666,10086);// 10086

Khả biến tham sổ mô bản đích ứng dụng

Cử cá ứng dụng đích lệ tử, hữu đích nhân tại debug đích thời hầu khả năng bất hỉ hoan dụng IDE đích điều thí công năng, nhi thị hỉ hoan thâu xuất trung gian biến lượng. Đãn thị, hữu thời hầu yếu thâu xuất đích trung gian biến lượng sổ lượng hữu điểm đa, tả thâu xuất trung gian biến lượng đích đại mã đích thời hầu khả năng hội bỉ giác phiền táo, giá thời hầu tựu khả dĩ dụng thượng khả biến tham sổ mô bản hòa khả biến tham sổ hoành.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// Author: Backl1ght
#include&LTbits/stdc++.h>
usingnamespacestd;

namespaceDEBUG{
templatetypenameT>
void_debug(constchar*format,Tt){
cerrformat'='tendl;
}

templateclassFirst,class...Rest>
void_debug(constchar*format,Firstfirst,Rest...rest){
while(*format!=',')cerr*format++;
cerr'='first",";
_debug(format+1,rest...);
}

templatetypenameT>
ostream&operator(ostream&os,constvectorT>&V){
os"[";
for(constauto&vv:V)osvv",";
os"]";
returnos;
}

#define debug(...) _debug(#__VA_ARGS__, __VA_ARGS__)
}// namespace DEBUG

usingnamespaceDEBUG;

intmain(intargc,char*argv[]){
inta=666;
vectorint>b({1,2,3});
stringc="hello world";

// before
cout"a="a",b="b",c="c
endl;// a=666, b=[ 1, 2, 3, ], c=hello world
// như quả dụng printf đích thoại, tại chỉ hữu cơ bổn sổ cư loại hình đích thời hầu thị bỉ giác phương tiện đích, nhiên thị như quả yếu thâu xuất vector đẳng đích nội dung đích thoại, tựu hội bỉ giác ma phiền

// after
debug(a,b,c);// a=666, b=[ 1, 2, 3, ], c=hello world

return0;
}

Giá dạng nhất lai, như quả sự tiên tại đại mã mô bản lí tả hảo DEBUG đích tương quan đại mã, hậu tục thâu xuất trung gian biến lượng đích thời hầu tựu hội phương tiện hứa đa.

Tham khảo

  1. C++ reference
  2. C++ tham khảo thủ sách
  3. C++ in Visual Studio
  4. Variadic template
  5. Variadic macros