-
CPP11初始化数组的方法:
- 初始化数组可以省略等号。
- 可以不在大括号内包含任何东西,这将把所有元素设置为零。
- 列表初始化禁止缩窄转换。
double arr[4] {1.2e4, 1.6e4, 1.1e4, 1.7e4};//okay with c++11. unsigned int counts[10] = {};//all elements set to 0. float balances[100] {};//all elements set to 0. long plifs[] = {25, 92, 3.0};//not allowed char slifs[4] {'h', 'i', 1122011, '\0'};//not allowed char tlifs[]
-
CPP允许拼接字符串字面值,即将两个用引号括起来的字符串合拼为一个:
std::cout<<"asdf" "sdf" "sdf"; std::cout<<"asdfsdfsdf"; std::cout<<"asdf" "sdf" "sdf";
asdfsdfsdf asdfsdfsdf asdfsdfsdf
-
string类位于命名空间std中,using编译指令,或者使用std::string来引用该类。
-
CPP表示字符串的字面值:
#include<iostream> #include<string> #include<format> int main() { wchar_t title[] = L"Chief Astrogator"; char16_t name[] = u"Felonia Ripova"; char32_t car[] = U"Humer Sup"; std::string str1 = R"(Jim "King" Tutt uses "\n" instead of end.\n)"; std::string str2 = R"+(("(Who wouldn't?)",she whispered,))+"; std::cout << title << std::endl; std::cout << name << std::endl; std::cout << car << std::endl; std::cout << str1 << std::endl; std::cout << str2 << std::endl; }
Chief Astrogator 0000004576F7F7A8 0000004576F7F7E8 Jim "King" Tutt uses "\n" instead of end.\n ("(Who wouldn't?)",she whispered,)
- 由于缺少char8_t,char16_t和char32_t的标准输出流,以上三种类型的字符串需要转化为窄字符串或者宽字符串,才能有意义的写入标准输出流,而且一般只有写入文件时才真正有用。
- 原始字符串需要在左边第一个"的后面添加’(‘和右边第一个"的前面添加’)',并且需要再字符串常量前添加R才能使用。
- 原始字符串如果包含括号,可以在"(之间添加字符,然后需要再)"之间也要添加相同的字符。
-
结构体声明和定义需要注意的是:
- 结构体允许声明的时候省略关键字struct。
- 结构体允许在函数内部和外部定义,但是定义在函数内部的结构体只能在该声明所属的函数使用,但CPP提倡外部结构声明。
- CPP11支持列表初始化运用于结构体,且等号可以省略,如果列表初始化的大括号未包含任何东西,则各个成员被设置为零,CPP11列表初始化不允许缩窄转换。
struct parts { unsigned long part_number; float part_cost; }; void func() { struct stone { int weight; int material; }; stone bigMao; } int main() { struct perks { int key_number; char car[12]; }; parts chicken1{ 12,12.0 }; parts chicken2{ 32,23.0 }; parts chicken3{}; perks mr_blug; }
-
结构体可以不写结构体名,枚举类型也是如此:
struct { int x, y; }; enum { red, green, };
-
使用new和delete应该遵守以下规则:
- 不使用delete来释放不是new分配的内存。
- 不使用delete来释放同一个内存块两次。
- 如果使用new[]为数组分配内存,则应该使用delete[]来释放。
- 如果使用new(没有方括号)为实体分配内存,则应该使用delete(没有方括号)来释放。
- 对空指针使用delete是安全的。
int main() { int* ps = new int; //ok delete ps; //ok delete ps; //not ok now int jugs = 5; //ok int* pi = &jugs; //ok delete pi; //not allowed,memory not allocated by new int* os = new int; int* oq = os; delete oq; //undefined behavior fotr deleting with second pointer,dont 't do it; int* pot = new int; short* pos = new short[500]; delete[] pot; //effect is undefined,dont't do it; delete pos; //effect is undefined,dont't do it; }
-
数组的替代品:
- 模板类vector,此模板类声明可以为std::vector<typeName> vt(n_elem);该类功能比数组强大,但是效率稍低。
- 模板类array,该模板类可以声明为std::array<typeName,n_elem> arr = { 2.3,4.5,4.3 };与vector对象不同的是,n_elem不能是变量,而且使用栈区,而不是堆区。
cpp primer plus笔记03-复合类型
于 2023-10-06 16:23:17 首次发布