学习笔记_009

  • 如何初始化类的对象由类本身决定
初始化string对象的方式:
string s1;//默认初始化,s1是一个空串
string s2(s1);//s2是s1的副本
string s2=s1;//与上面等价
string s3(“book”);//s3是字面值“book”的副本,除去字面值最后空字符
string s3=”book”;//与上面等价
string s4(n,’b’);//将s4初始化为由连续n个字符b组成的字符串
  • 使用等号初始化一个变量,实际上执行的是拷贝初始化,反之不使用等号执行是直接初始化

  • 进行读取操作时,string对象会自动忽略开头的空白(空格,回车,制表符)并从第一个真正的字符开始读起,直到遇见下一处空白为止。

  • getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符为止

  • string对象使用加法运算符(+)时,要保证(+)两侧的运算对象至少有一个是string

  • 为了与C兼容,C++语言中的字符串字面值并不是标准库类型string的对象,切记,字符串字面值与string是不同的类型

  • C++兼容C的标准库,C中头文件形如name.h,C++将这些文件命名为cname。在cname头文件中定义的名字从属于命名空间std。一般来说C++程序员应使用cname的头文件而不是name.h的形式,标准库中的名字总能在命名空间std中找到,如果使用.h,程序员就不得不时刻牢记哪些是从C那儿继承过来的

  • 标准库类型vector表示对象的集合,其中所有的对象的类型都相同。集合中的每个对象都有一个与之对应的索引,索引用于访问对象。(容器)vector是类模板

  • vector能容纳绝大数类型的对象作为其元素,但因为引用不是对象,所以不存在包含引用的vector

初始化vector对象的方法:
vector<T> v1;//默认初始化,空vector
vector<T> v2(v1);//v2中包含v1所有元素的副本
vector<T> v2=v1;//与上面等价
vector<T> v3(n,val);//v3中包含了n个重复的元素,每个元素的值都是val
vector<T> v4(n);//v4包含n个对象
vector<T> v5{a,b,c...};//列表初始化
vector<T> v5={a,b,c...};//与上面等价
  • vector的成员函数push_back负责把一个元素当作vector的对象压到(push)vector的尾端(back)

  • 要使用size_type,必须明确哪种类型指定了它,vector对象的类型总是包含着元素的类型

    vector::size_type

  • 有迭代器的类型同时拥有返回迭代器的成员(函数),这些类型都拥有名为begin和end的成员,其中begin成员负责返回指向第一个元素(或第一个字符)的迭代器,end成员则负责返回指向容器尾元素的下一位置的迭代器。一般来说,我们不清楚(不在意)迭代器准确的类型到底是什么,一般使用auto关键字

*iter 返回迭代器iter所指元素的引用

  • 箭头运算符( -> )把解引用和成员访问两个操作结合在一起

  • 不能在范围for循环中向vector对象添加元素,另外一些可能改变vector对象容量的操作,如push_back,都会使该vector对象的迭代器失效

  • 与vector不同的是,数组的大小确定不变,不能随意向数组中增加元素

  • 数组的维度必须是一个常量表达式

  • 字符数组有一种额外的初始化形式,即用字符串字面值对此类数组进行初始化,注意字符串字面值结尾的空字符一样会被拷贝到字符数组当中

  • 不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值

int  *ptrs[10];//ptrs是一个含有10个整型指针的数组
int  &refs[10];//错误,不存在引用的数组,引用不是对象
int  (*parray)[10];//parray指针指向一个含有10个整数的数组
int  (&arrRef)[10]=arr;//arrRef引用一个含有10个整数的数组
int  arr[]={0,1,2,3,4,5,6,7,8,9};
int  *e=&arr[10];//指向arr尾元素的下一位置的指针
  • 这里显然索引了一个不存在的元素,尾元素所在位置的索引是9,接下来那个不存在的元素唯一的用处就是提供其地址用于初始化e

  • C++11引入了两个名为begin和end的函数(不是成员函数),begin函数返回数组首元素的指针,end函数返回指向数组尾元素下一位置的指针,这两个函数定义在iterator头文件中

int arr[]={0,2,4,6,8.}
int i=arr[2];//arr将转换成指向数组首元素的指针,arr[2]得到(arr + 2)所指的元素
int *p=&arr[2];//p指向索引为2的元素
int j=p[1];//p[1]等价于*(p+1),就是arr[3]表示的那个元素
int k=p[-2];//p[-2]就是arr[0]表示的那个元素
  • 尽管C++支持C风格字符串,但在C++程序中尽量不要使用他们

string对象与C风格字符串的混用:
允许使用以空字符结束的字符数组来初始化string对象或为string对象赋值
在string对象的加法运算中允许使用以空字符结束的字符数组作为其中一个运算对象(不能两个运算对象都是)

  • string提供了一个名为c_str的成员函数,c_str函数返回一个C风格的字符串。也就是说,函数返回的结果是一个指针,该指针指向一个以空字符结束的字符数组,而这个数组所存的数据恰好与那个string对象一样。结果指针的类型是const *char,从而确保我们不会改变字符数组的内容

  • 不允许使用vector对象初始化数组,但可以用数组来初始化vector对象

int int_arr[]={0,1,2,3,4,5,};
vector<int> ivec( begin(int_arr), end(int_arr) );
  • 现代的C++程序应当尽量使用vector和迭代器,避免使用内置数组和指针;应尽量使用string,避免使用C风格的基于数组的字符串

  • 严格来说C++程序中没有多维数组,通常所说的多维数组其实是数组的数组

  • 对于一个二维数组来说,通常第一个维度称作行,第二个维度称作列

  • 要使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值