前面一段时间我们学习了NDK开发的C语言的一些知识,从今天开始我们学习C++的知识,今天我们采用C语言和C++对比的方式来认知一下C++.这篇文章篇理论的东西比较多,看着有点枯燥,如果有理解不了的,暂时跳过,后面的文章中来逐步学习解释。
对比:
1、C++是标准的面向对象的语言,C语言是面向过程的语言;
2、C++的标准支持库#include <iostream> , C语言的标准支持库#include<stdio.h>;
3、C++可以运行C语言,可以调用C语言,反之:C语言不能调用C++;
4、C++ 增加了命名空间的特性;
5、C++支持函数重载,而C语言不支持函数重载;
6、C和C++中的bool 值,都是非0即true ,否则是false;
7、栈区开辟的空间在函数弹栈会释放掉,堆区开辟的空间需要在使用结束后手动释放掉;
1、命名空间及其自定义
命名空间时C++引入的一个范围限制的概念,类似于作用域的限定;C++库提供了命名空间及其内部的API ,当然我们也可以自定义命名空间。
说明:
1、命名空间使用namesapce + 名字来进行自定义;
2、命名空间内部可以嵌套N层自定义命名空间,通过::进行多层嵌套调用;
3、通过可以使用using namesapce 来引入,调用空间内的函数时,就不需要命名空间名称+:: 来限定;
示例代码:
namespace CustomNameSpace{
namespace InnerLayer{
void innerShow(){
cout<<"内部嵌套的命名空间函数innerShow()被调用"<<endl;
}
}
void show(){
cout<<"自定义命名空间里面的show()被调用"<<endl;
}
}
int main(){
CustomNameSpace::InnerLayer::innerShow();
CustomNameSpace::show();
return 0;
}
/**
*输出结果:
* 内部嵌套的命名空间函数innerShow()被调用
* 自定义命名空间里面的show()被调用
*/
2、C语言与C++中的真假常量
C语言中的常量其实是个假常量,可以通过指针修改;而C++中的常量则不然,编译不通过或者运行报错
示例代码:
int main(){
const int number = 100;
printf("C语言const number 的值是:%d, \n",number );
int * numP = &number;
*numP = 10000;
printf("C语言通过指针修改常量的值:%d\n", number);
return 0;
}
/**
* 输出的结果:
* C语言const number 的值是:100,
* C语言通过指针修改常量的值:10000
*/
3、C++中的引用(非常重要)
说明:
1、C++的引用其实用就是别名或者绰号的意思,其实和他所引用的对象都是指向同一块地址
2、常量引用(const int& ) :该引用变量变成只读
//直接参数交换-不成功
void switchNumber(int number1, int number2) {
cout<<"number1 的地址是:"<<&number1<<",number2的地址是:"<<&number2<<endl;
int temp = number1;
number1 = number2;
number2 = temp;
}
//指针交换
void switchNumber1(int* number1, int* number2) {
cout<<"number1 的地址是:"<<number1<<",number2的地址是:"<<number2<<endl;
int temp = *number1;
*number1 = *number2;
*number2 = temp;
}
//引用交换
void switchNumber2(int& number1, int& number2) {
cout<<"number1 的地址是:"<<number1<<",number2的地址是:"<<number2<<endl;
int temp = number1;
number1 = number2;
number2 = temp;
}
//常量引用
typedef struct {
char name[20];
int age;
}Student;
void insertStudent(const Student & student)//常量引用,在函数体内部能修改student的值,只能读取
{
// Student student1={"bbbbb",2};
// student=student1;//常量引用不能修改
cout << student.name << "," << student.age << endl;
}
int main(){
int number1 = 100;
int number2 = 200;
cout<<"*****switchNumber直接交换值*******"<<endl;
cout << "交换之前的两个数:number1=" << number1 << " 的地址:"<<&number1<<", number2=" << number2 << " 的地址:"<<&number2<< endl;
switchNumber(number1, number2);
cout << "交换之后的两个数:number1=" << number1<< " 的地址:"<<&number1 << ", number2=" << number2 << " 的地址:"<<&number2<< endl;
cout<<endl;
cout<<endl;
cout<<"*****switchNumber1 指针交换*******"<<endl;
cout << "交换之前的两个数:number1=" << number1 << " 的地址:"<<&number1<<", number2=" << number2 << " 的地址:"<<&number2<< endl;
switchNumber1(&number1, &number2);
cout << "交换之后的两个数:number1=" << number1<< " 的地址:"<<&number1 << ", number2=" << number2 << " 的地址:"<<&number2<< endl;
cout<<endl;
cout<<endl;
cout<<"*****switchNumber2 引用交换*******"<<endl;
cout << "交换之前的两个数:number1=" << number1 << " 的地址:"<<&number1<<", number2=" << number2 << " 的地址:"<<&number2<< endl;
switchNumber2(number1, number2);
cout << "交换之后的两个数:number1=" << number1<< " 的地址:"<<&number1 << ", number2=" << number2 << " 的地址:"<<&number2<< endl;
cout<<endl;
cout<<endl;
//常量引用
Student student={"aaaa",1};
insertStudent(student);
return 0;
}
/**
* 输出结果:
* *****switchNumber直接交换*******
* 交换之前的两个数:number1=100 的地址:0x61fe1c, number2=200 的地址:0x61fe18
* number1 的地址是:0x61fdf0,number2的地址是:0x61fdf8
* 交换之后的两个数:number1=100 的地址:0x61fe1c, number2=200 的地址:0x61fe18
*
* *****switchNumber1 指针交换*******
* 交换之前的两个数:number1=100 的地址:0x61fe1c, number2=200 的地址:0x61fe18
* number1 的地址是:0x61fe1c,number2的地址是:0x61fe18
* 交换之后的两个数:number1=200 的地址:0x61fe1c, number2=100 的地址:0x61fe18
*
*
* *****switchNumber2 引用交换*******
* 交换之前的两个数:number1=200 的地址:0x61fe1c, number2=100 的地址:0x61fe18
* number1 的地址是:200,number2的地址是:100
* 交换之后的两个数:number1=100 的地址:0x61fe1c, number2=200 的地址:0x61fe18
*/
4、函数重载的二义性
说明:
1、若重载函数的参数类型相同,参数数量不同,但是多出的参数有默认值,或者是所有的参数都有默认值,这样会导致函数二义性的问题
2、函数重载,有默认值的参数必须全部在无默认值的参数后面
3、参数数据类型不一致时,不会导致二义性
示例代码:
int add(int number1,int number2){
}
int add(int number1,int number2,int number3=0)
{
//1、默认值参数必须在无默认值的参数后面
//2、有二义性
}
int add(bool a ,bool b)
{
//此函数无二义性
}
int main(){
add(1,2);//此时会出现二义性
return 0;
}
5、常量指针,指针常量,常量指针常量的深入理解
说明:
1、常量指针:该指针指向的是一个“常量”,不允许修改“常量”的值,但是该指针可以重新指向
**const int* number=....**
2、指针常量:该指针是一个常量,只能指向一个地方,不能重新指向,但是可以修改指向的内存的值
**int* const number=...**
3、常量指针常量:明该指针是一个常量,该指针所指的也是一个“常量”,所以不能重新指向,也不能修改内存的值
**const int * const number=....**
实例代码:
int main(){
int number = 100;
int number2 = 200;
//常量指针
const int *numberP1 = &number;
// *numberP1 = 999;//不允许修改指向的内存值
numberP1 = &number2;//可重指向
//指针常量
int* const numberP2=&number;
// numberP2=&number2;//不允许重指向
*numberP2=666;//可可以指向的内存值
//常量指针常量
const int* const numberP3=&number;
// numberP3=&number2;//不允许重指向
// *numberP3=888;//不允许修改指向的内存的值
return 0;
}
网友评论