声明:

  • 文中内容收集整理自《C++ Primer 中文版 (第5版)》,版权归原书所有。
  • 学习一门程序设计语言最好的方法就是练习编程。

1、8比特的char类型计算机表示的实际范围是-128-127。

2、赋值给无符号类型unsigned 时,如果超出它的显示范围,则结果是初始值对无符号类型表示数值总数取模后的余数。

  如:unsigned char c = -1,则char占8比特,c的值是255。

  赋值给带符号类型signed时,如果超出它的范围,结果是未定义的。此时可能继续工作、崩溃或者产生垃圾数据。

  如:signed char c2 = 256 ,则char占8比特,c2的值是未定义的。

3、如果表达式里有带符号数和无符号类型,当带符号类型取值为负数时会出现异常结果。因为带符号数会自动转换成无符号数。

  如:

  unsigned u = 10;
  int i = -42;
  cout << u + i; //会输出一个很大的数 (2^32)

4、变量提供一个具名的、可供程序操作的存储空间,C++中每个变量都有它的数据类型。数据类型决定便佞所占内存空间的大小和布局方式,该空间能存储的值的范围,以及变量能参与的运算。C++中变量(variable)和对象(object)可以交换使用。

  对象指的是一块能存储数据并具有某种类型的内存空间。

5、初始化不等于赋值。初始化是创建变量时赋予其一个初始值,而赋值的含义是把对象当前值擦除,而以一个新值代替。出于安全考虑,建议初始化每一个内置类型的变量。

6、C++语言支持分离式编译机制,该机制允许将程序分割为若干个文件,每个文件可被独立编译生成目标文件,最后将所有目标文件连接起来形成单一的可执行文件。

  为了使用在其他文件中定义的变量,需要在当前文件中对将要使用的变量进行声明。声明使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。而定义负责创建与名字关联的实体。

  声明规定了变量的名字和类型,除此之外,定义还申请存储空间,也可能为变量赋一个初始值。

  如果声明而不定义,则在变量名前加extern。

  任何包含显式初始化的声明即成定义。

  在函数体内部,如果试图初始化一个由extern关键字标记的变量将会引发错误。

    extern int i; //声明
    int j; //定义
    extern int i = 10; //定义

  变量能且仅能被定义一次,但可以被多次声明。

7、作用域:

  名字有作用域,变量有生命周期

  C++中的作用域有全局作用域块作用域之分。

  • 全局作用域:名字在整个程序范围内都可使用
  • 块作用域:名字仅在部分范围内可用

  作用域还可以嵌套。

  名字的作用域始于名字的声明语句,以声明语句所在的作用域末端为结束

  同一个名字在不同的作用域中可能指向不同的实体。

  建议,在对象第一次被使用的地方附近定义它。也就是说越迟越好。

8、引用 

  区别于普通类型的变量,引用有以下几个特点:

  • 引用只是别名,定义引用时,程序把引用和它的初始值绑定在一起
  • 引用本身不是对象,编译器不会为引用分配内存空间,它只是一个别名

  牢记以上两点就很容易理解引用了:

  • 引用必须初始化(定义时要执行绑定的过程)引用的初始值必须是一个对象,而不能是字面值或者表达式。
  • 对引用进行操作,实际是在操作引用绑定的对象(引用只是别名)

9、指针

  指针与引用相似,也实现了对其他对象的间接访问,然而与引用也有不同。其一,指针本身就是一个对象。可以对其赋值和拷贝。而且指针的声明周期类可以先后指向几个不同的对象。其二,指针无需在定义的时候被赋值。
  指针存放的是其他对象的地址。
  

  前面我们用&操作符进行引用的定义,它同时也是取地址符

  int ival = 1024;
  int *p = &ival; //p存放变量ival的地址,或者说p是指向变量ival的指针

  &操作符取出变量ival的地址赋值给指针p

  同样的,*操作符也具备两重身份,它同时也是解引用符

  int i2 = *p;

  对指针解引用得到的是指针所指的对象,如果给解引用的结果赋值,实际上也就是给指针所指的对象赋值。

  对指针p解引用得到它所指的对象ival,然后ival的值用于初始化新定义的整型变量i2。

  

  更复杂的情况:

  int ival = 1024;  
  int *p = 0 //p合法,是一个空指针
  int *pi = &ival; //pi是个合法指针,存放着ival的地址
  int **ppi = &pi;//ppi指向一个int型的指针

  以及

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

  遇到这种复杂的情况时,我们可以使用从右向左阅读的方法

    1. 离变量名最近的符号对变量的类型有直接的影响,ppi是一个指针,r是一个引用
    2. 声明符的其余部分用来确定关联对象的类型,ppi指向的是一个指针,r引用的也是一个指针。

10、const

  const对象的作用域

  • 默认状态下,const对象仅在文件内有效
  • 如果想要在多个文件中共享const对象,则需要在声明和定义时添加extern关键字
  //file_1.cc, 定义 并初始化一个常量,该常量能被其他文件访问
  extern const int bufSize = fcn();   //file_1.h 头文件
  extern const int bufSize;//与file_1.cc中定义的bufSize是同一个

  const的引用

  可以把引用绑定到const对象上,称为对常用的引用,简称为常量引用

  const int ci = 1024;
  const int &r = ci;

11、2月22日   六级又没过。 已经不记得是第五次还是第六次了,真是烦,心态爆炸。单词也背了,真题也做了,考完感觉一定能过,就是差很多。哎,只能怪自己太菜了。下次就加口语了,感觉更过不了。感谢DT,LL,YY安慰,这点小事还是扛得住的。去他妈的六级,过您令堂大人的臭嗨。继续学习。

12、  2.5处理类型????没看完。看不懂了
13、2.6自定义数据结构
  数据结构是把一组相关的数据元素组织起来然后使用它们的策略和方法。
  类以关键字struct开始,紧跟着类名和类体(类体部分可以为空)。类体由一个花括号包围成一个新的作用域。类内部定义的名字必须唯一,但可以与外部定义的名字重复。
  最好不要把类的定义和对象的定义放在一起。类定义最后要加上分号。
  如 
  struct Person{
    std::string iName;
    std::string iAge;
    std::string sID;
    double dHeight;  
    double dWeight;
  };  //定义一个人的名字,姓名,ID,,身高,体重。
  程序员是代码世界的造物者。

14、头文件通常包含那些只能被定义一次的实体,如类、const变量和constexpr变量等。

头文件存在多次包含的情况(直接和间接),编译器会把头文件中的内容拷贝到包含文件中,而我们又要确保头文件中的内容不被多次定义。

确保头文件多次包含仍能安全工作的常用技术是预处理器(preprocessor)。

头文件保护符(header guard)

预处理变量有两种状态:

  已定义的和未定义的。#define指令把一个名字设定为预处理变量。另外两个检查某个指定的预处理变量是否已定义。

  #ifdef已定义时为真。#ifndef未定义时为真。#endif截止。

15、实现P64-P67的书店程序

 头文件Sale_data.h://头文件只能定义和声明,不能赋值。赋值会报错。

#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
struct Sales_data{
std::string bookNo;
unsigned units_sold;
double revenue;
}; #endif // SALES_DATA_H_INCLUDED

源文件Sale_data.cpp:

 #include<iostream>
#include<string>
#include"Sales_data.h" int main(){ Sales_data data1,data2;
double price = ;
std::cin>>data1.bookNo>>data1.units_sold>>price;//读入第一本书的编号单价和数量
data1.revenue=data1.units_sold*price;//计算第一本书的收入 std::cin>>data2.bookNo>>data2.units_sold>>price;//读入第二本书的编号单价和数量
data2.revenue=data2.units_sold*price;//计算第二本书的收入 if(data1.bookNo == data2.bookNo){
unsigned totalCnt = data1.units_sold + data2.units_sold;
double totalRevenue = data1.revenue + data2.revenue;
    //输出
std::cout<<data1.bookNo<<" "<<totalCnt<<" "<<totalRevenue<<" ";
if(totalCnt)
std::cout<<totalRevenue/totalCnt<<std::endl;
else
std::cout<<"(no sales)"<<std::endl;
return ;
}else{
std::cerr<<"Data must refer to the same ISBN"<<std::endl;
return -;
} }

输入两个交易记录:

0-201-78345-x 3 20.00

0-201-78345-x 2 25.00

 
16、第二章看了两天,指针、const那一部分没看懂,以后还要回来再看。往前走,且随疾风前行。

《C++ Primer》读书笔记—第二章 变量和基本类型的更多相关文章

  1. C++ Primer 笔记(2)第二章 变量与基本类型

    第二章 变量与基本类型 1.基本内置类型包括算术类型和空类型,算术类型分为两类:整型(包括字符和布尔类型)和浮点型: 2.布尔类型(bool)的取值是真(true)或者假(false): 3.字面值常 ...

  2. <<C++ Primer>> 第二章 变量和基本类型 术语表

    术语表 第 2 章 变量和基本类型 地址(address): 是一个数字,根据它可以找到内存中的一个字节    别名生命(alias declaration): 为另一种类型定义一个同义词:使用 &q ...

  3. STL源码分析读书笔记--第二章--空间配置器(allocator)

    声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...

  4. Getting Started With Hazelcast 读书笔记(第二章、第三章)

    第二章 起步 本章就相当简单粗暴了,用一个个例子说明hazelcast怎么用. 1.map,set,list这些集合类都是开箱即用的,只要从Hazelcast的实例中获取一份就行. 2.增加了Mult ...

  5. Java Concurrency in Practice 读书笔记 第二章

    第二章的思维导图(代码迟点补上):

  6. Spring 3.x 实践 第一个例子(Spring 3.x 企业应用开发实战读书笔记第二章)

    前言:工作之后一直在搞android,现在需要更多和后台的人员交涉,技术栈不一样,难免鸡同鸭讲,所以稍稍学习下. 这个例子取自于<Spring 3.x 企业应用开发实战>一书中的第二章,I ...

  7. javascript 数据结构和算法读书笔记 > 第二章 数组

    这章主要讲解了数组的工作原理和其适用场景. 定义: 一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量. javascript数组的特殊之处: jav ...

  8. [Effective Java 读书笔记] 第二章 创建和销毁对象 第一条

    第二章  创建和销毁对象 第一条 使用静态工厂方法替代构造器,原因: 静态工厂方法可以有不同的名字,也就是说,构造器只能通过参数的不同来区分不同的目的,静态工厂在名字上就能表达不同的目的 静态工厂方法 ...

  9. C primer plus 读书笔记第二章

    这章的标题是C语言概述,内容大概是介绍一些简单的示例程序,来了解和熟悉C语言的一些基本特征. 这是书里的第一段代码,敲敲找找感觉.推荐在linux环境下写代码. PS:倒腾sublime text一下 ...

随机推荐

  1. 关于Android反编译

    详情查看:http://blog.csdn.net/ordinaryjoe/article/details/8626010

  2. js实现从字符串中查找出现次数最多的字符的两种解决办法

    方法一:正则表达式匹配 var str = "adadfdfseffserfefsefseeffffftsdg"; ; var result = ""; whi ...

  3. C++的封装性

    C++的封装性 C++的阶段,我想根据C++的一些特有的特性分别写一些专题,每个专题我都捎带讲一些语法,当然不会很多,我还是会像C语言那样,内存结构贯穿始终,有汇编就有真相…… 本专题,我们讲述封装性 ...

  4. iOS UICollectionView高级用法(长按自由移动cell)-新

    [reference]http://www.jianshu.com/p/31d07bf32d62 iOS 9之后: 示例如下 效果 前言: 看完你可以学到哪些呢? 就是文章标题那么多, 只有那么多. ...

  5. 11.TCP的交互数据流

          TCP报文段一般有两类,分别是成块数据和交互数据. 1.交互式输入     Rlogin连接上键入一个交互命令的数据流如下图所示.     每一个交互按键都会产生一个数据分组,每次从客户传 ...

  6. ANT编译时执行Junit测试

    1.Junit.jar(和jakarta-ant-optional.jar 不是必须) 放在ant_home/lib中,用于支持build.xml中的<junit>标签 2.修改build ...

  7. MYSQL 函数复习

    数学函数    ABS(X)    返回X的绝对值    SQRT(x)        返回非负数X的二次方根    MOD(x,y)    返回x被y除后的余数    CEIL(x)         ...

  8. IE6滤镜在实战测试中能让父层里面的子元素产生阴影

    1.写法一: <div class="cornerbg">    <p class="title-file">------</p& ...

  9. JavaScript 扯几句单线程相关

    JavaScript 扯几句单线程相关 众所周知,Javascript是单线程执行的,这也就是说:JavaScript在同一个时间上只能处理一件事.他不像C,Java等这些多 线程的,可以开不同的线程 ...

  10. --@ui-router——$state服务原版详解

    $state service in module ui.router.state Description $state service is responsible for representing ...