二章 札记 --C++ primer 之旅

实习告一段落,翻开C++primer 准备苦逼的重温C++ 。以下是一些 从书上抄下来的笔记。

测试: -10u 是什么类型?

-10u 类型是unsigned int  使用 typeid(-10u).name() 测试的

变量的初始化:
1、复制初始化: int ival=1024;
2、直接初始化: int ival(1024);
直接初始化语法更灵活且效率更高。

初始化和复制的区别:
     初始化是创建变量并给它赋予初始值,而赋值是擦除对象的当前值并用新值代替。

变量的定义和声明:
      定义(define): 为变量分配存储空间,还可以为变量指定初始值
      声明(declare): 向程序表明变量的类型和名字
    可以用extern 关键字声明变量名而不定义。如果声明有初始化式,可被当做定义,即使声明标记为extern。
EX:extern double pi = 3.16  //difinition
注意: 只有当extern 声明位于函数外部时,才可以含有初始化式
原因如下:
1、变量只能定义一次,所以,不关怎样,只能有一个extern int i=1这样的定义;
2、extern定义的变量必须是全局的,这样才可能在其他文件中使用,所以,不能再语句块里定义

const 关键字
     const对象默认为文件的局部变量。
      一个非const变量定义在file_1中,如果在file_2 中声明(extern)了,就可以在file_2 中使用。
     全局作用域(global scope)声明的const 变量是定义该对象的文件的局部变量,不能被其他文件访问。
     可以使用extern修饰const变量,可以在整个程序访问const 对象。EX: extern const int ival = fcn();
结论: 非const 变量默认为extern。要使const变量能在其他的文件中访问,必须显示指定为extern
      原因: 在于允许const变量定义在头文件中


const 引用
     非const引用只能绑定到与该引用同类型的对象
      const 引用则可以绑定到不同当相关的类型的对象或绑定到右值。 EX: double dval=3.14; const int &ri=dval;


typedef
     定义类型的同义词:
          EX: typeof int integer1;
                typeof integer1 integer2;


class 和 struct 关键字定义类的唯一差别就是 默认访问级别: struct 的成员是public , class 的成员为private


头文件包含在多个源文件中,所以不应该含有变量或函数的定义。
 3个例外: 1、类的定义;2、const 对象 ;3 、inline 函数
 注意:
因为const 对象默认为定义它的文件的局部变量,所以把它们的定义放在头文件是合法的。 当我们在头文件定义了const变量后,每个包含该头文件的源文件都有了自己的const 变量,其名称和值都一样。
如果const变量不是用常量表达式初始化,那么它就不能在头文件中定义。 只能在一个源文件中定义并初始化,然后在头文件中为它添加extern 声明,以使被多个文件共享。(这里还不是很清除,求路过的大爷指教委屈


预处理器

预处理器变量的名字在程序中必须是惟一的。
     (变量经常用大写字母表示)
预处理器变量两种状态: 已定义 或 未定义
#define 指示接受一个名字并定义该名字为预处理器变量
#ifndef  指示检测指定的预处理器变量是否未定义
预防多次包含同一个头文件:
#ifndef  SALESITEM_H
#define SALESITEM_H
     //Definition of Sales_item calss 
#endif
通过使用类名来组成头文件和预处理器变量的名字,可以使得很可能只有一个文件将会使用该预处理器变量。 


在头文件中: 必须总是使用完全限定的标准库名字. 原因: 如果头文件中放置using声明,则包含该头文件的每个程序中都放置了同一个using 声明,无论该程序是否需要。


标准库 string 类型
#include <string>
using std::string;
4种默认构造函数:
     1)   string s1;
     2)   string s2(s1);
     3)   string s3("value");
     4)   string s4(n,'c');          'c'的n个副本

string的读取:
     string  str; 
     cin>>str;       1)读取并忽略开头所遇到的空白字符(空格、换行符、制表符)
                          2)读取字符直到再次遇到空白字符,读取终止
     getline 读取整行文本; getline(输入流,string对象)
                         getline 函数返回时丢弃换行符,string对象不会存储换行符。

string.size() 字符的个数 :  返回 string:size_type 类型数据,不要用int类型存储。

string 对象字符的处理 cctype 头文件里
     isalnum(), isalpha() .....之类的函数。

vector 类型
#include<vector>
uisng std::vector;
vector 对象的定义和初始化4种:
     1)vector<T> v1;
     2)vector<T> v2(v1);
     3)vector<T> v3(n,i)   n个值为i 的元素
     4)vector<T> v4(n)        
vector.size() 元素的个数 :  返回 vector<T>::size_type 类型数据,不要用int类型存储。
EX: vector<int>::size_type; //ok
      vector::size_type  //error

解引用操作符(*)
iterator 迭代器:
     vector::iterator  解引用时,得到对某个元素的非const引用
     vector::const_iterator   解引用时得到一个指向const 对象的引用,不能改变元素的值

     对比: const 的 iterator对象,声明一个const迭代器是, 此迭代器指向的元素内容不能修改,迭代器的值本身可以修改。

      const_iterator 对象可以用于const vector 或 非const vector ,因为它不能改变元素值
EX:
     const vector<int> nines(10,9);
     vector<int>::iterator ct1 = nines.begin();  //error
     vector<int>::const_iterator ct1 = nines.begin();  //ok

迭代器的算术运算:
     1)iter+/- n  ;           //n 为 vector的 size_type 或 difference_type 类型
     2)iter1 - iter2   ;     // difference_type


bitset 类型
#include<bitset>
using std::bitset;
定义 4种:
     1) bitset<n> b;          // b 有n位,都为0
     2) bitset<n> b(u);     // b  是 unsigned long 型u 的一个副本
     3) bitset<n> b(s);      // b 是 string 对象s 中含有的位串的副本
     4) bitset<n> b(s,pos,n) // s从pos 开始的n个位的副本
注意: 用string对象初始化bitset 对象是,string对象直接表示为位模式,从string对象读入位集的顺序是从右向左。
bitset.size() 操作返回的类型是 size_t 类型, 定义在 cstddef 头文件中,其大小足以存储内存中对象的大小。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值