1基础框架
#include<iostream> //头文件
using namespace std; //std标准命名空间
int main()
{
cout<<"Hello world!!!"<<endl; //标准输出 endl表示换行
return 0;
}
(较C语言d的好处:输入输出不需要控制格式,例如:整型%d,字符型%c。)
标准输入cin 遇到空格、tab或者换行符作为分隔符
例
char arr[10];
cin>>arr; //输入hello world时
cout<<arr<<endl; //输出为hello
2缺省参数
//缺省参数
#include<iostream>
using namespace std;
//这儿的0就相当于缺省参数,如果实参什么都没传过来,缺省参数就赋值给a,相当于备胎的意思。
void func(int a = 0)
{
cout << a << endl;
}
int main()
{
func(10);
func(); //在c语言中这样写肯定是不行的,但是在c++中有了缺省参数,如果你什么都不传,只要你前面有缺省参数的存在,就能过。
return 0;
}
(1)全缺省(即函数的全部形参都设置为缺省参数)
//全缺省
#include<iostream>
using namespace std;
void func(int a = 0, int b = 1, int c = 2)
{
cout <<"a="<< a << endl;
cout << b << endl;
cout << c << endl;
}
int main()
{
func();
return 0;
}
(2)半缺省参数 (必须从右往左依此给出!!)
//错误示例
void func(int a, int b = 2, int c)
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
//正确示例
void func(int a, int b = 2, int c=0)
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
(3)缺省值必须是常量或者全局变量
//正确示例
int x = 3;//全局变量
void func(int a, int b = 2, int c = x)
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
(4)缺省参数不能在函数声明和定义中同时出现
//错误示例
//test.h
void func(int a, int b, int c = 3);
//test.c
void func(int a, int b, int c = 2)
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
3函数重载
c++中,可在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同。
#include <iostream>
using namespace std;
int Add(int x, int y)
{
return x + y;
}
double Add(double x, double y)
{
return x + y;
}
int main()
{
cout << Add(0,1) << endl;//打印0+1的结果
cout << Add(1.1,2.2) << endl;//打印1.1+2.2的结果
return 0;
}
(若仅仅是返回值不同,其他都相同,则不构成函数重载)
short Add(short left, short right)
{
return left+right;
}
int Add(short left, short right)
{
return left+right;
}
4引用
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。对引用的操作与对变量直接操作完全一样。
引用的声明:类型标识符 &引用名=目标变量名;
(1)引用在定义时必须初始化
(2)一个变量可以有多个引用
//可行
int a = 10;
int& b = a;
int& c = a;
int& d = a;
(3)引用一旦引用了一个实体,就不能再引用其他实体
(4)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名
常引用 声明方式:const 类型标识符 &引用名=目标变量名
void TestConstRef()
{
const int a = 10;
//int& ra = a; // 该语句编译时会出错,a为常量
const int& ra = a; //正确
// int& b = 10; // 该语句编译时会出错,b为常量
const int& b = 10; //正确
double d = 12.34;
//int& rd = d; // 该语句编译时会出错,类型不同
const int& rd = d; //正确
}
将不可修改的量用可读可写的量来引用是不可以的,但是反过来是可以的,将可读可写的量用只可读的量来引用是可以的!
引用的作用:
1.引用作为参数
//交换函数
void Swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
与指针相比:
1)引用在定义时必须初始化,指针没有要求。
2)引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体。
3)没有NULL引用,但有NULL指针。
4)在sizeof中的含义不同:引用的结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)。
5)引用进行自增操作就相当于实体增加1,而指针进行自增操作是指针向后偏移一个类型的大小。
6)有多级指针,但是没有多级引用。
7)访问实体的方式不同,指针需要显示解引用,而引用是编译器自己处理。
8)引用比指针使用起来相对更安全。
2.引用作为返回值
(1)以引用返回函数值,定义函数时需要在函数名前加&
(2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。
因为在函数内部定义的普通的局部变量会随着函数调用的结束而被销毁,所以返回的数据必须是被static修饰或者是动态开辟的或者是全局变量等不会随着函数调用的结束而被销毁的数据。