cpp primer plus笔记03-复合类型

  1. 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[]
    
  2. CPP允许拼接字符串字面值,即将两个用引号括起来的字符串合拼为一个:

    std::cout<<"asdf" "sdf" "sdf";
    std::cout<<"asdfsdfsdf";
    std::cout<<"asdf"
    "sdf" "sdf";
    
    asdfsdfsdf
    asdfsdfsdf
    asdfsdfsdf
    
  3. string类位于命名空间std中,using编译指令,或者使用std::string来引用该类。

  4. CPP表示字符串的字面值:

    #include
    #include
    #include
    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才能使用。
    • 原始字符串如果包含括号,可以在"(之间添加字符,然后需要再)"之间也要添加相同的字符。
  5. 结构体声明和定义需要注意的是:

    • 结构体允许声明的时候省略关键字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;
    }
    
  6. 结构体可以不写结构体名,枚举类型也是如此:

    struct 
    {
    	int x, y;
    };
    enum
    {
    	red,
    	green,
    };
    
  7. 使用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;
    }
    
  8. 数组的替代品:

    • 模板类vector,此模板类声明可以为std::vector<typeName> vt(n_elem);该类功能比数组强大,但是效率稍低。
    • 模板类array,该模板类可以声明为std::array<typeName,n_elem> arr = { 2.3,4.5,4.3 };与vector对象不同的是,n_elem不能是变量,而且使用栈区,而不是堆区。

你可能感兴趣的:(c++,笔记,c++)