1.C++的数据类型
基本数据类型:char,int,float,double,void,bool
非基本数据类型:数组,指针,结构体,联合,枚举,类
2.C++的命名空间
a.命名空间:定义了某些标识符的作用域,使得我们在使用同名全局变量时不发生冲突
eg:
#include<iostream> using namespace std;//使用标准命名空间 int main() { cout<<"hello poppy!"<<endl; return 0; } //在此程序里我们也可以不使用命名空间来调用cout和endl #include<iostream> int main() { std::cout<<"hello poppy!"<<std::endl; return 0; }
tips: "::"是作用域解析符,此处使用"::"唯一的标识了cout和endl隶属于std这个命名空间
b.自定义的命名空间
在C++程序中,我们不仅可以使用标准的命名空间,也可以使用我们自定义的命名空间
而自定义的命名空间的灵活性更大
eg:
#include<iostream> using namespace std; namespace myname { int a=10; } namespace Myname { int b=20; } namespace myname { int c=30; } using namespace myname; using namespace Myname; int main() { cout<<a<<endl; cout<<b<<endl; cout<<c<<endl; return 0; } /*输出结果:10 20 30 */
从上面程序可以看出命名空间可以拆分开来定义,我们在使用某个命名空间中所定义的 成员之前必须使用using namespace …… 或者 ……::
3.函数的重载
什么叫做函数的重载?
函数的重载允许我们定义多个相同函数名但参数列表不同的函数
eg: #include<iostream> using namespace std; int add(int a,int b) { return a+b; } float add(float a,float b) { return a+b; } int main() { int num1 = 2; int num2 = 3; float num3 = 2.2; float num4 = 4.3; int ret1 = add(num1,num2); float ret2 = add(num3,num4); cout<<ret1<<endl<<ret2<<endl; return 0; }
输出结果:5
6.5
从上面程序我们可以分析出在我们调用函数时,不需要考虑调用的是什么函数,而由编译器在 根据参数列表
对函数进行重命名之后,根据我们所传的实参类型来判断应该使用哪个函数,所以重载函数的 参数列表必须不同
否则,编译器将无法决定应该调用哪个函数!
4.缺省参数
在C++程序中,我们允许在函数具有默认参数时缺省实参的形式,缺省参数又分为全缺省和部分缺省
a.全缺省参数
eg:
int add(int a = 1,int b = 2) { return a + b; } int main() { cout<<add()<<endl; cout<<add(2)<<endl; cout<<add(2,3)<<endl; return 0; }
输出结果:3
4
5
观察结果,我们不难发现,当我们没有传参时函数默认使用 1,2作为参数,当我们传一个参数 时,我们实际上覆盖了a的默认值,而当我们传2个参数时,函数使用我们所传参数作为实参。
b.部分缺省参数
eg:
int add(int a ,int b = 2) { return a + b; } int main() { cout<<add(3)<<endl; cout<<add(3,4)<<endl; return 0; }
输出结果:5
7
同全缺省参数,部分缺省参数也允许我们在函数提供默认参数时使用它的默认参数而不重新传
值得注意的是,函数的默认参数必须连续地出现在参数列表的右边,因为参数的覆盖总是从左 往右进行的!
5.引用
a.引用的定义
引用类似于我们给变量起了一个别名。
eg:
int m = 3; int &n = m; //此时n的值就是3,它们的内容相同,存放地址也相同
b.引用和指针
指针 | 引用 |
可以为NULL | 必须为有效值 |
可以随时改变所指向的对象 | 在创建时确定,引用的对象永不改变 |
sizeof确定的大小永远确定 | sizeof确定引用的对象的大小 |
“++”“--”指针发生偏移 | “++”“--”引用对象的内容改变 |
保存了所指向对象的地址 | 引用即原来的变量的别名 |
c.函数的引用调用
eg:
void swap(int &a,int &b) { int tmp = a; a = b; b = tmp; } //此程序可以成功的交换两实参的内容
通过上面的程序可以看出引用调用为我们提供了不少便利之处,它使我们的程序更加的简洁
又能够实现和指针相同的效果而避免许多指针存在的问题
tips:函数的返回值也可以是引用,但你必须保证当你返回了一个临时变量的引用时必须用一个
已经创建好的变量来接收他。但通常我们不建议返回一个临时变量的引用。
d.const引用
eg:
int m = 10; const int &n=m; n = 20;//该赋值语句将不会通过编译
请始终记得在C++里const被严格的定义为readonly 请不要试图改变由const修饰的值
我们常常使用 const 引用来保护函数中不允许被改变的参数
eg: void func(const int &a)
此时a的值不允许被改变
临时变量的引用需加const修饰
eg:
double d = 3.14; const int &k=d; //如果必须引用一个临时变量请务必加上const修饰
如果此时我们查看内存就会发现k和d并不存储于同一位置,因为k引用知识d在转化时 生成的一个临时变量而非d本身
tips:引用常量必须加上const
eg:
int &a = 5;//编译不能通过 const int &a = 5;//正确
本文出自 “Zimomo” 博客,请务必保留此出处http://zimomo.blog.51cto.com/10799874/1738039
原文:http://zimomo.blog.51cto.com/10799874/1738039