用《C++ primer》深入理解C++

本文介绍了C++中的输入输出流对象cin和cout,以及<<和>>运算符的使用。讨论了变量的初始化,包括列表初始化和默认初始化,并强调了类型转换在布尔表达式中的作用。此外,详细阐述了引用的概念,强调其必须初始化且不可重新绑定。还提到了指针的常量性,包括顶层const和底层const的区别。
摘要由CSDN通过智能技术生成

Day 1_2023.06.13

  • cin是istream类的一个对象,同理cout是ostream类的一个对象
  • std::cout<<a<<endl; “<<”运算符表示将给定的值写入左边的ostream对象,输出结果是左边的ostream对象。std是命名空间,意思是使用的是std中的cin和cout。同理,“>>”运算符左边为一个istream对象,从给定的istream中读入数据并存入右侧对象中,返回的是左侧的运算对象。
  • while(std::cin>>value){}可以读取不定数量的数据,直到读到eof或输入错误时停止。
  • 经验:使用int进行整数运算,超过int使用long long;使用double执行浮点数运算,比float精度高,计算开销也相差无几,long double一般情况下没必要使用。
  • 曾经学过的一个知识点int i; if(i)....其中i为0时if判断语句为假,其余值都为真。其实这背后的逻辑是类型的转换,其中if括号中需要的是布尔变量,当非布尔变量给布尔变量赋值时有以下规则:0赋给布尔变量时为false,其余都为true。因此才有了非0的int值都判断为true。

Day 2_2023.06.14

  • C11:使用含一组初始值的花括号进行列表初始化,当使用列表初始化且初始值有信息丢失的风险时,如double转int小数部分被截断等,则编译器将报错。
  • 初始化:一个对象在创建时被赋予了特定值叫初始化。变量默认初始化:定义在函数体外的内置类型变量若未被显式初始化,则会被默认初始化,默认值由变量类型决定。函数体内部的内置类型变量若不显式初始化,则会不被初始化,若此时试图拷贝或访问此类值,则会出错。类自己决定可不可以不经初始化定义对象(使用默认构造函数),若可以不显式地初始化,则其值由类确定。
  • 变量的声明与初始化与extern关键字:声明规定变量类型和名字,定义除此之外还申请存储空间并可能赋初值。变量只能被定义一次,但可以被声明多次。extern表示此变量/函数是在别处定义的,要在此处引用,不分配存储空间。任何包含显式初始化的声明便成为定义。如果要在多个文件中使用同一个变量,则必须将变量的声明与定义分离,此时定义只能出现在一个文件中,其他使用该变量的文件使用前必须声明该变量,但不能重复定义。通常不在头文件中定义变量,而是声明变量,这样包含头文件时就包含了变量的声明。
 extern int i;//仅仅声明变量i
 int j;//声明并定义j
 extern int a(1);//显式初始化a,此时extern语句就是定义而非声明了
  • 命名风格:变量名全小写,类名开头大写,多个单词用下划线或驼峰式
  • 引用:引用必须被初始化。引用不能为空,引用没有地址,引用初始化后不能换绑(实际上也没有这样的语法,因此不用担心重复绑定的错误),引用不能绑定未初始化的变量。引用只能绑定在对象上,不能绑定到字面值或表达式的计算结果。
 int y;
 int &ref = y;//错误,引用不能绑定到未初始化的对象
 int &x = 10;//错误,引用不能绑定到字面值
  • 引用初始化后的赋值操作:目前看来引用初始化后可以大胆的给引用赋值或者使用引用给别的变量赋值,因为说到底引用就是别名,并且绑定后再不会换绑了。
int i = 0,&ref1 = i;
double d = 0,&ref2 = d;
ref2 = 3.14159;//正确,等价于给变量d赋值3.14159
ref2 = ref1;//正确。等价于d = i
i = ref2;//正确,等价于 i = d
ref1 = d;//正确,等价于i = d
  • 不能把int型变量赋给指针,即使变量值为0也不行。
  • 理解有*和&的声明:以前会有种误解,int* p;好像int* 修饰了其后的所有变量,所有变量名都会被声明为指针类型,其实恰恰相反,int* p1,p2;这里p1会被声明为int型的指针,而p2仅仅是int型,因此实际的效果是int *p1,p2;。于是设计指针或引用的声明有两种写法:1)int *p1,*p2;*或&放变量名前2)int* p1;int* p2;*或&放类型名后,但每一句只定义一个变量。
  • 指向指针的引用:引用本身不是对象,就不存在指向引用的指针,但指针是对象,因此存在指向指针的引用。要明白ref到底是什么东西,从右往左看,ref左边紧接&,表示ref是一个引用,再往左看一个*和int,表示ref指向的是一个int型的指针。
 int i = 1;int *p = &i;int *&ref = p;//ref为一个指向指针p的引用

Day 3_2023.06.15

  • 常量指针(顶层const)与指向常量的指针(指针常量)(底层const)
    const int *p;//定义了一个指向常量的指针(指针常量),表示该指针指向的地址中的内容是一个常量。但是没有规定它所指的对象一定是非得是一个常量。所谓指向常量的指针仅仅要求不能通过该指针修改所指对象的值,而没有规定所指的对象的值不能通过其他途径改变。并且p的值是可以被修改的。
    int * const p;//定义了一个常量指针,内含是该指针的值是一个常量,即指向的地址是不能改变的,但地址的内容是可以通过该指针或其他途径改变的。
    const int * const p; //定义了一个指向常量的常量指针

  • 引用的本质是一个常量指针;this指针定义是Type * const this;因此可知this指针也是一个常量指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值