学完了面向过程的C语言,现在开始学习面向对象的C++,先了解一下面向过程与面向对象的区别:
面向过程就是分析出解决问题的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个调用就行。
面向对象是把构成问题事物分解成各个对象,建立对象的目的,不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。
C与C++的不同:
1.关键字的不同:
C99标准下C语言的关键字有32个
C98标准下C++的关键字有64个
2.变量定义声明位置不同
C语言变量必须在函数开始声明
C++可以在函数任意位置声明(注意作用域)
3.函数
返回值类型:C++新增了bool类型,可以返回bool型,也可以没有返回值
参数:C++支持缺省参数
函数名修饰方式不一样:C++可以出现同名函数(重载)
4.工程
用VS创建工程时,C语言工程后缀是.c,而C++后缀是.cpp
5.C++ 的struct内可以有函数,而C不行。
让C++文件以C风格编译:extern “C” int Fun();
缺省参数:缺省参数是声明或定义函数时为函数的参数指定一个默认值,在调用该函数时,如果没有指定实参则才用该默认值,否则使用指定的实参。
全缺省:
void Fun(int a = 10, int b = 20, int c = 30)
{
cout << a << b << c << endl;
}
int main()
{
Fun();
}
半缺省:
void Fun1(int a, int b, int c = 30)
{
cout << a << b << c << endl;
}
int main()
{
Fun1(10,20);
system("pause");
}
注意:缺省参数只能从右往左给参数。
缺省参数要放在函数声明位置,在声明和定义中只能出现一次。
可以是常量或全局变量。
一词多义—重载
函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同(有一个满足即可),常用来处理功能类似数据类型不同的问题。
int add(int a, int b)
{
return a + b;
}
double add(double a, double b)
{
return a + b;
}
long add(long a, long b)
{
return a + b;
}
int main()
{
add(10, 20);
add(10.0, 20.0);
add(10L, 20L);
return 0;
}
注意:仅返回类型不同不能构成重载
如:
int add(int a, int b)
{
return a + b;
}
double add(int, int b)
{
return a + b;
}
引用:引用不是新定义一个变量,而是给已存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,他和他引用的变量共用同一块内存空间
void Fun()
{
int a = 10;
int&ra = a;
cout << a << ra;
}
引用的特性:
1.引用在定义时必须初始化
2.一个变量可以有多个引用
3.一旦引用一个实体,再也不能引用其他实体
常引用:
void Fun()
{
const int a = 10;
//int& ra = a; //该语句编译时会出错,a为常量
const int& ra = a;
//int& b = 10; //该语句编译时会出错,b为常量
const int& b = 10;
double d = 2.33;
//int& rd = d; //该语句编译时会出错,类型不同
const int& rd = d;
}
数组引用:
void Fun()
{
int a[10];
int(&ra)[10] = a;
}
看下面这个例子:
int& Fun()
{
int a = 0;
a += 10;
return a;
}
int main()
{
int& ra = Fun();
printf("ra = %d\n", ra);
printf("ra = %d\n", ra);
printf("ra = %d\n", ra);
system("pause");
return 0;
}
结果为:
10
随机值
随机值
注意:返回值如果是引用类型,返回值的声明周期一定要比函数的长(不能返回栈上空间)
引用和指针的区别:
在底层的处理方式相同,引用当作指针来处理
引用变量在底层对应指针的类型: 类型* const //类型指实体的类型
1.引用不可以为空,指针可以为空
2.引用不可以改变指向
3.引用的大小是所指向的变量的大小,指针是指针本身的大小
4.引用比指针安全(不存在空引用,指针为空时易出错)
5.引用在定义时必须初始化
6.有多级指针,没有多级引用
7.指针需要手动寻址,引用通过编译器寻址
命名空间 : 在C++中,变量,函数和类都是大量存在的,这些变量,函数和类的名称将都存在于全局命名空间中,会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
定义命名空间:
//命名空间可以嵌套
namespace N2
{
int a;
namespace N3
{
int i, int z;
}
}
//同一个工程中允许出现同名的命名空间,编译器会将同名命名空间的内容整合
namespace N1
{
int b;
}
//没有名称的命名空间只能在当前文件中使用(和static类似)
namespace
{
int arr[10];
}