#### 什么是C++ ####
————C语言的超集
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为>特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。
#### 第一个C++程序 ####
源代码:HelloWorld.cpp
#include //输入输出流 cout endl
//using namespace std;
int main()
{
//cout << "HelloWorld!!!" << endl;
std::cout << "HelloWorld" << std::endl;
//std:命名空间
//:::名字限定符
//cout:标准输出流(对象),根本实质是一块内存
//<< 或者 >> :操作符
//"HelloWorld!!!":字符串
//endl:换行控制器,作用是输出一个回车换行,和C语言中\n(基于Linux)作用一样
return 0;//0表示成功,其他表示错误,不同返回值代表不同错误码
}
/*
在Linux终端执行过程和C语言基本一致,不过此时使用g++工具。
1,编译:g++ HelloWorld.cpp -o HelloWorld
2,执行: ./HelloWorld
3,结果输出: HelloWorld!!!
*/
/*
从上述源代码看C++和C的区别:
1,文件后缀名:.cpp
2,头文件:#include
3,命名空间:using namespace std;
4,标准输出流:cout;输出运算符:<<;换行控制器:endl
5,编译工具:g++
*/
实验 :分别实现以下C和C++代码,分析总结
源代码:printf.c (C代码)
#include
void printf()
{
printf("Hello C \n");
}
int main()
{
printf();
}
//error: conflicting types for ‘printf’
//编译时会报错;使用标示符命名自定义函数时,C语言要求不能冲突
#include
//#include 此处不可以使用,因为下面代码没有使用cout endl
void printf()
{
printf("Hello C++ \n");
}
int main()
{
printf();
return 0;
}
//函数重载:函数名相同只有参数(个数或者类型)不同
//注意:C语言不支持重载;C++支持重载
实验:分别实验以下C和C++代码,分析总结
源代码:scope.c
#include
void test()
{
printf("thie is test \n");
}
void test()
{
printf("this is another test \n");
}
int main()
{
test();
}
//error: redefinition of ‘test’
//此处定义两个test函数,在调用时,C语言无法识别调用哪个,报错:重复定义
源代码:scope.cpp
#include
namespace fsx1{
void test(){
printf("this is test \n");
}
}
namespace fsx2{
void test(){
printf("this is another test \n");
}
}
int main(){
fsx1::test();
fsx2::test();
return 0;
}
//C语言不支持命名空间,C++支持命名空间
//定义命名空间:namespace 空间名{}
//引用命名空间:using namespace 空间名;
全局命名空间
默认的命名空间,所有名字都在全局命名空间中。
使用方式:直接忽略或者只写 ::
例如:定义全局函数void test();,默认就是在全局命名空间中,调用方式test()或者::test()。
在C++中,不带.h后缀的头文件所包含和定义的标识符在std空间中;
带.h后缀的头文件所包含和定义的标识符在全局命名空间中,不需要声明使用std空间
命名空间的作用:避免全局变量、函数、类的命名冲突(因为名字相同而编译失败)。
引用命名空间:using namespace 空间名;
标准命名空间:std
#### 动态内存 ####
实验:分别实验以下C和C++代码,分析总结
源代码:dynamic_mem.c
#include
#include
int main()
{
int *num = (int *)malloc(sizeof(int));
*num = 100;
printf("%d \n",*num);
free(num);
// delete num;//error: unknown type name ‘delete’ C语言不识别delete
}
#include
#include
using namespace std;
int main()
{
int *num = new int;
*num = 100;
cout << *num << endl;
// delete num;
free(num);
cout << *num << endl;
return 0;
}
//malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符。
//既然new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete、malloc/free必须配对使用。
问题:
1,malloc()申请内存,是否可以使用delete销毁内存?
可以使用;但是会使代码的可读型降低;不建议,也不合理。
2,new申请内存,是否可以使用free()销毁内存?
不可以;如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。
/*
问题:
1,命名空间占内存大吗?
不占,内存存放函数地址,参数,变量等
2,命名空间与文件的关系?
一个文件可以定义多个命名空间,一个命名空间可以在多个文件中定义。
3,const关键字作用与#define宏定义区别?
const 在编译阶段执行;且要进行类型检查
#define在预编译阶段;不进行类型检查,只是单纯替换
4,const char * p;char * const p与char const *p区别?
1,3一样;const修饰char* 标示指针指向的内容不可修改
2,标示指针的指向不可修改
*/