这个笔记是基于C++面向对象程序设计写的。这是我读的第一本C++参考书,简单易懂。
几个简单的C++程序
例1 输出”Hello World”
#include <iostream>
int main(){
using namespace std; //命名空间
cout<<"Hello World!"; //程序输出
return 0;
}
程序运行时输出:
Hello World!
cout用于标准输出,与<<搭配使用,会自动辨别数据类型,使用cout(后面还会学到的cin也是)要使用到iostream头文件。C++系统提供的头文件不带.h后缀,但C++也可使用C的带.h后缀的头文件。
“using namespace std”的意思是“使用命名空间std”。
求和
#include <iostream>
int main(){
using namespace std;
int a,b,sum;
cin>>s>>b; //用户输入
sum=a+b;
cout<<"a + b = "<<sum<<endl;
return 0;
}
如用户输入
1 2
则程序输出
a + b = 3
cin与cout类似,是C++系统定义的输入流对象,与>>搭配使用,会自动辨别数据类型。
endl是C++输出时的控制符,作用是换行(endl是endline的缩写,与 \n作用相同)。
比较大小
#include <iostream>
int main(){
using namespace std;
int max(int,int); //使用函数前先声明原型
int a,b;
cin>>a>>b;
cout<<"max = "<<max(a,b);
return 0;
}
int max(int a,int b){
int tmp;
tmp=a>=b?a:b;
return tmp;
}
如用户输入
20 10
则程序输出
max = 20
- 程序第4行是对max函数的声明。C++中当函数的定义在函数的调用之后时,强制要求声明,否则会报错。声明时,参数可以只写类型,就像上面一样。
几个细节问题
cout与cin
cout是标准输出流,cin是标准输入流(即通过键盘和显示屏输入输出)
cout和<<搭配使用
cout<<"张三"<<" 18岁"<<endl; //endl表换行
cout<<setw(6)<<userId<<endl; //setw()设置显示宽度
cout<<hex<<20<<dec<<20<<oct<<20;//hex十六进制,dec十进制,oct八进制
cout输出时并未指定数据类型(如C中的%d,%f,%c等),cout<<会自动判定数据类型。
控制符setw()指定输出所占的列数(必须包含头文件iomanip.h).
cin也会自动识别数据类型
C++为输入输出流提供了格式控制,如dec(十进制),hex(十六进制),oct(八进制)。
const定义常量
const float PI=3.1415926;
- const可以避免C语言中的#define定义符号常量的缺点。
函数重载
函数的参数个数或类型不同,但函数名相同
int max(int,int);
float max(float,float);
函数名相同,但函数的参数个数或类型不同的几个函数
注意:仅仅只有函数的返回类型不同不是重载,因为C++无法在调用时通过返回类型区分不同的函数。
函数模板
template <typename T>
T max(T a,T b){
return a>=b?a:b;
}
- template 的含义是模板,尖括号中的typename是关键字(用class也可,但class也是类的关键字,易用混,建议用typename),T是随意指定的一个代表某一数据类型的符号。
有默认参数的函数
可在函数原型声明时给出默认值
float area(float r=3.2); //有默认值的参数在参数列表中的最后
若函数定义在函数调用之前,默认值在函数定义时给出,否则,默认值在函数声明时给出。
一个函数不能既是重载又有默认值。
指定默认值的参数必须放在形参列表的最右端。
变量的引用
int a;
int &b=a; //b是a的引用,相当于别名,二者同步
将引用作为参数
void swap(int &a,int &b){
//...
}
swap(x,y);//调用时只要直接传入变量就可以了
引用又称别名,对变量声明一个引用并不另开辟内存单元,与原变量共享同一内存单元。在声明引用时必须同时初始化。
当&a的前面有类型符时(如int &a),它必然是对引用的声明,否则&就是地址运算符。
不能建立void类型的引用,不能建立引用的数组。
内置函数
会在编译时自动将所调用的函数代码嵌入到主函数中,提高效率
inline int max(int a,int b){ //只需要加上关键字inline即可
//...
}
- 只要在函数定义时加上inline就可以了。
作用域运算符
::a表示全局作用域中的a
//...
int a=10;
int main(){
int a=20;
cout<<a<<endl; //20
cout<<::a<<endl; //10
return 0;
}
字符串变量
使用前必须先加载string头文件
#include <string>
int main(){
string str1="Hello ";
string str2 +="World!";
cout<<str2<<endl;
return 0;
}
将字符串常量存入字符串变量中时,只存放字符串本身而不包括“\0”。
字符串赋值 string1=string2=”zhangsan”;
字符串连接 string1=string1+string2;
字符串比较,直接用==,>,< ,!=, <=, <=。
字符串数组string name[5]; string name[3]={“zhangsan”,”lisi”,”wangwu”};
使用new和delete动态分配和撤销内存
new int;
new int(100);
new char[20];
new int[2][3];
float *p=new float(3.14);
delete p;
delete []pt;
new 会返回一个指向特定数据类型的指针。
通过返回的指针来进行操作,如下例:
Student *p=new Student;
strcpy(p->name,"zhangsan");
p->num=10123;
p->sex="M";
cout<<p->name<<" "<<p->num<<" "<<p->sex<<endl;
delete p;