【修炼C++】基础知识点笔记-第2章

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/albert19891108/article/details/83933393

重新学习c++的东西,此为《C++ Primer》读书笔记,主要记录零碎的知识。另外所有的C++11新标准也会被列出。

1,C++ 语言支持分离式编译机制,该机制允许将程序分割为若干个文件,每个文件可以被独立编译。

2,名字的作用域:全局作用域,块作用域。

for(int val = 0;val<10;++val)

val 的作用域只在for语句内,因为其定义于for语句内。

3,: : 域访问符

#include<iostream>

int reused = 42;

int main()
{
    int reused = 0;
    //使用局部变量
    std::cout<<reused<<std::endl;
    //显式访问全局变量
    std::cout<<::reused<<std::endl;
}

4, 引用;定义引用时,程序把引用和它的初始值绑定(bind)在一起。无法令引用重新绑定到另一个对象,因此引用必须初始化。引用本身并非一个对象,因此无法将指针指向一个引用

5,空指针;不指向任何对象,C++11中引入nullptr这种特殊类型的字面值。

6,指向指针的引用。

int i = 42;
int *p;      //p是一个int型指针
int *&r = p; //r是一个对指针p的引用

r = &i;      //r引用了一个指针,因此给r赋值&i就是令p指向i
*r = 0;      //解引用r得到i,也就是p指向的对象,将i的值改为0

7,const限定符;

      const对象一旦创建后其值就不能再改变,所以const对象必须初始化。(可以在运行时初始化,也可以在编译时初始化)。

      编译时初始化,编译器将在编译过程中把用到该变量的地方都替换成对应的值。

      默认情况下,const对象仅在文件内有效。若要在文件间共享,则需要在定义和声明时都添加extern关键字,这样定义一次即可

const int i = get_size(); //正确:运行时初始化
const int ci = 42;         //正确:编译时初始化

//file_1.cc定义并初始化了一个常量,该常量能被其它文件访问
extern const int bufSize = fcn();
//file_1.h头文件
extern const int bufSize;

8,const的引用

注意:常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未做限定。因为对象也可能是个非常量,所以允许通过其他途径改变它的值。

int i = 42;
int &r1 = i;        //引用ri绑定对象i
const int &r2 = i;  //r2也绑定对象i,但是不允许通过r2修改i的值
r1 = 0;             //r1并非常量,i的值修改为0
r2 = 0;             //错误:r2是个常量引用

9、指针和const

指向常量的指针:不能改变其所指向对象的值。const int  *ptr = &pi; 

常量指针:必须初始化,而且一旦初始化完成则它的值(也就是存放在指针中的那个地址)就不能再改变了。

                     int *const curr = &val

弄清楚这些声明的含义最行之有效的办法是从右向左阅读。

10,顶层const

顶层const:表示任意的对象是个常量,对任何数据类型都适用。

底层const:与指针和引用的基本类型部分有关。

指针类型可以是顶层const也可以是底层const。

当执行对象的拷贝操作时,顶层const不受什么影响。执行拷贝操作并不会改变被拷贝对象的值,因此,拷出和拷入的对象是否是常量都没什么影响。底层const的限制无法忽略,在执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换。一般来说,非常量可以转换为常量。

11,常量表达式:值不会改变并且在编译过程就能得到计算结果的表达式。

       C++11新标准规定,允许将变量声明为constexpr以便由编译器来检验变量的值是否为一个常量表达式(若非则报错)

       一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象。在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关。类似于顶层const。

12,类型别名:

        传统方法:关键字typedef。例:typedef  wags double

        C++11新标准:关键字using。例:using wags=double

13,C++11新标准引进auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。因为auto让编译器通过初始值来推算变量的类型,因此,auto定义的变量必须有初始值。注意在用auto在一条语句中声明多个变量时,只能有一个基本数据类型,所以该语句中所有变量的初始基本数据类型都必须一样。 

(1)使用引用其实是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实是引用对象的值,此时编译器以引用对象的类型作为auto的类型,因此编译器无法将auto变量指定为引用类型,需要程序员自行设置。

(2)auto一般会忽略掉顶层const,同时底层const会保留下来。

14,C++11新标准引入第二种类型说明符,decltype,它的作用是选择并返回操作数的数据类型。

(1)引用从来都作为其所指对象的同义词出现,只有在decltype处是个例外

(2)decltype的结果类型与表达式形式密切相关。如变量名加上一对括号,则编译器就会把它当成是一个表达式。decltype((variable))的结果永远是引用。赋值是会产生引用的一类 典型表达式,引用的类型就是左值的类型。

int ia[]={0,1,2,3,4,5,6,7,8,9}; //ia是一个含有10个整型的数组
auto ia2(ia);                   //ia2是一个整型指针,指向ia的第一个元素
ia2=42;                         //错误:ia2是一个指针,不能用int值给指针赋值

//ia3是一个含有10个整数的数组
decltype(ia) ia3 = {0,1,2,3,4,5,6,7,8,9}
ia3 = p; // 错误:不能用整型指针给数组赋值
ia3[4] = i;//正确:把i的值赋给ia3的一个元素

15,C++11新标准规定,可以为数据成员提供一个类内初始值(in-class initializer)。创建对象时,类内初始值将用于初始化数据成员。没有初始值的成员将被默认初始化。

struct Sales_data{
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
}

猜你喜欢

转载自blog.csdn.net/albert19891108/article/details/83933393
今日推荐