关键词:编译器会将其视作为具有特殊意义的名称,在声明变量、函数名称时,不可与关键词相同。
C++内建数据类型:
是我们编程的基石(整形、浮点型),但若是只使用基础的数据类型来编程,远远不够,麻烦冗余。为此有类的概念,增强抽象层次。
字符常量:可打印字符、不可打印字符(用字符序列来表示)。
字符串常量:可包含可打印字符和不可打印字符。
类:
分为两部分,头文件和实现文件,头文件用于表示类所提供的各种操作,实现文件是类的操作具体实现内容。使用类,需要包含头文件
对象定义与初始化:定义对象的时候,为什么一定要写明所属的数据类型呢?为了在编译的时候就能够分配内存空间。在使用变量前要保证为其进行初始化。初始化语法:赋值运算符,构造函数语法。这里,如果是自定义的类型,包含多个数据成员,此时初始化无法使用=来进行,而是需要调用类的构造函数。对于模板来说,我们大多数的情况下未实例化前是不知道数据类型的,但需要使用类型参数的变量来做初始化操作,如果对于内建的数据类型和自定义的类型初始化的语法不同,那么模板该如何写???为此编译器统一了初始化语法,因此对于内建的基本数据类型,也可以使用构造函数语法进行初始化。
常量:程序运行的过程中,值不会发生变化,使用const修饰,以保证我们无意修改常量值时编译器能帮助我们发现问题。
表达式:由一个或多个运算对象构成,运算对象之间通过运算符连接起来。求解表达式会得到一个值。
运算符:算术(加减乘除模)、关系、逻辑、复合(对某个对象进行操作并将结果重新赋给该对象)、条件。
条件运算符:表达式?***:****
非0数即是true;0即是false。
递增(递减)前置、后置区别:
先对原值进行运算,再来做其他运算,或是相反的操作。
关系运算符:
逻辑运算符:
&&(骤死式评估法)、||(骤死式评估法)、!,用来连接多个关系表达式,是多个if…else if的等效替代形式。
&& 和||连接的表达式是有顺序的
运算符优先级:
一个表达式有多个运算符,那么该如何确定运算顺序?除了为运算符添加优先级,还有更好的方法吗?!编译器可以为我们确定一个运算次序,可是那个次序并不是我们所期待的,为此我们可使用()来改变运算次序。
函数:独立的代码序列,由4部分构成:返回类型、函数名、参数列表、函数体。需要特别地来理解一下main()返回值:当返回0时代表函数正常执行,当返回非0值时代表函数执行过程出错。函数名不可与关键词相同,符合命名规则且能表达含义。参数列表表示了调用者可以传递给函数的参数类型和个数。函数体即是函数所执行的操作。
输入输出:
并非是C++语言本身所定义的部分,而是由类体系所支持。(属于标准程序库一部分)
cin、cout标准输入输出对象,能进行合适的类型转化。(当操作数是基本类型时),如果是自定义类型,我们需要为自己的编写的类重载<<、>>运算符。(友元函数)
命名空间:
为了避免名称冲突(程序中两个不同的实体有相同的名称),由此产生了名称空间的概念。将程序库的名称封装起来。标准程序库所提供的类,对象,方法,函数都被封装在名称空间std中。
下例是关于简单的输入输出,getline()、标准输入输出的理解。
#include "stdafx.h"
#include<iostream>
#include<string>
int main()
{
using std::cout;
using std::cin;
//std::string name;
//std::cin >> name;
//getline(std::cin,name);
using std::string;
string firstname;
string lastname;
cout << "enter first name :";
getline(cin, firstname);
cout << "enter last name :";
getline(cin, lastname);
//std::cin >> firstname >> lastname;
cout << "\nhello " << firstname<<" , "<<lastname<< " welcome to C++!\n";
std::cin.get();
//std::cin.get();
return 0;
}
从对象定义初始化、书写表达式到形成语句,程序都只是按照固定的顺序执行着,有没有觉得太单调?要说人是高级动物,不外乎我们可以做出根据合适的条件思考进而做出选择,为了让程序聪明一点点,自身也是加入了条件语句和循环语句。根据条件来选择执行与否、是否多次执行。
条件语句:
if 对应的else子句的两种形式:
仅有两种情况且只有一个成立:
至少三种情况,且只有一个成立,一旦一个成立了,之后的都不用再判断:
测试条件属于整形时,可使用switch…case代替if…else if。
swtich(整形表达式){
case 常量表达式:
****
break;
default:
}
向下穿越
循环语句:
while先测试条件,成真时执行代码段,在代码段内的某一条件成真下修改循环语句所控制的条件为false,在循环体内肯定是需要配合条件语句来改变循环语句中条件。
break终止循环
continue停止循环的现行迭代,重新判断循环条件决定是否执行循环体
for循环,适用于修改计数器、知道循环次数的循环语句,如果一开始的条件就是false,那么expression就不会被执行到。
指针的好处:
既可以表示地址,也可以获取地址空间内的值。使用指针解除引用时要格外注意的问题,是否为空指针,该地址值并不知向任何类型的数据。若是仍对空指针解除引用,程序发生什么就不一定了。。。
对于指针还想使用下标运算符,先对指针解除引用,在使用下标运算符即可。但此时,下标运算符的优先级更高,因此需使用小括号改变优先级。
文件的输入输出:
只是对一个文件进行读操作,使用ifstream类即可,此时文件读取的位置位于文件头,只是对文件进行写操作,使用ostream类即可,但此时根据使用文件的模式,文件指针位于不同的位置,ios::out模式下文件指针位于头部(删除原有文件内容),ios::app模式下文件指针位于文件末尾。同时读写一个文件,使用fstream类,此时写模式设置为ios::app,但此时读取文件存在问题,文件指针位于末尾,此时使用seekg()将文件位置位于起始处。但写入时会追加到文件末尾。
//练习1.6
#include "stdafx.h"
#include<vector>
#include<iostream>
#include<algorithm>
#include<iterator>
using namespace std;
const int SIZE = 100;
int main()
{
int a[SIZE];
vector<int > b(SIZE);
int n;
int count = 0;
while (cin >> n)
{
if (count>SIZE)
{
break;
}
a[count] = n;
b[count++] = n;
}
for (int i = 0; i < count; i++)
cout << a[i] << " ";
cout << endl;
for (auto x : b)
cout << x << " ";
cout << endl;
cin.clear();
cout<<(char )cin.get();//类型不符合的字符没有被抽走 自然之后的字符更不会被抽走
cin.get();
//cout<<(char )cin.get();
cin.get();
return 0;
}
有一个程序尚未解决。。。。