Essential C++ 第一章
文章目录
1.如何撰写C++程序
输入和输出的语句为
#include<iostream>
int main()
{
int a;
cin>>a;
cout<<a<<endl;
}
2.对象的初始化
对象的初始化有两种方法
(1)直接赋值法
int a = 3;
(2)初始化列表的方法
int a(3);
初始化列表的方法的出现是因为,有些变量不是单值的,比如说复数,包含实部和虚部,必须要使用两个变量进行初始化,所以就会有输入两个参数的问题,因此初始化列表是非常有价值的。
3.运算符
运算符主要包括算术运算符、关系运算符和逻辑运算符
其中,有一个比较好用的功能,属于算术运算符的范围,就是用条件表达式的方法给数据分行,比如想输出输出,5个分一行,就可以写做
cout<<data
<<(num%5?' ':'\n');
4.array和Vector
主要写一下vector的初始化,有两种方法,一种是使用初始化列表的方法,一种是截取数组数据。
(1)初始化列表
Esential C++说vector不支持这种写法,但是VS是可以使用的。
#include<vector>
vector<int> vc[5] = {1,2,3,4,5}
不写中括号也行
(2)截取数组的方法
#include<vector>
vector<int> VC(array,array+size);
这是通过地址的方法实现的,括号中分别为首地址和末端地址。使用这种方法构造的vector与原来数组是独立的关系,不会因为修改了其中一个而改变另外一个。
5.指针
5.1 指针的使用
(1)指针初始化的时候如果没有绑定变量,应该初始化为空指针。
int *p = 0;
(2)指针用于判断时,应该避免使用空指针,因此应该使用短路运算进行
if(p&&*p!=1024)
{
}
}
当p为空指针是,其值为0,由于短路运算,后面那个表达式便不再计算,所以指针的表达式,应该先排除他不是空指针
(3)指针具有双重性。不但含有地址信息,而且能够访问地址指向的变量。这种功能叫做提领作用。
5.2指向vector的指针
定义为
vector<int> vec = {1,2,3,4,5}
vector<int> *p= &vec;
当有多个vector存在时,我们希望用指针的方式进行调用,可以采用索引的方式进行,之间如上面所示的直接调用,会丧失透明性,具体指代的对象可能不容易看出来,而使用索引的方式就能很好的看出来。
//01定义一些vector
vector<int> Fibonacci = {1,1,2,3,5,8,13,21};
vector<int> Lucas = { 1,3,4,7,11,18,29,47 };
vector<int> Pell = { 1,2,5,12,29,70,169,408 };
//02 将这些类的指针地址组合在vector中
vector<int>* p[3] = { &Fibonacci,&Lucas,&Pell };
//03使用随机数去寻找这些vector
srand(time(NULL));
int index = rand() % 3;
vector<int>* q = p[index];
//04 打印选到的
for (int i = 0; i < q->size(); i++)
{
cout << (*q)[i] << endl;
}
5.3指向vector的指针的数据调用
我们假设要做这样一件事情,判断一个vector是否为空,如果不为空,第2个元素是否为0。
程序为
vector<int>a = {1,0,2,3};
if(!a.empty()&&a[1]===0)
{
}
}
如果是指向vector的指针怎么做这件事情呢?
这个判断主要做了两件事情,即访问了类的成员函数和成员变量。使用了点号(成员变量选择运算符)和中括号(索引符号)
vector<int> a = {1,0,2,3};
//01定义指针
vector<int> *p = &a;
//02调用成员函数
//成员函数的调用使用->
//写作:p->empty();
//03 调用成员变量
//因为索引优先级比指针运算符高,要加括号
//写作:(*p)[1]
//04 要注意判断指针不能为空指针的问题
//05 综上所述,上面的那句判断应该写作
if(p&&!p->empty()&&(*p)[1]==0)
{
}
6.文件操作
需要头文件 fstream
包括读写两方面