c语言相面过程,c++面向对象
c++能够对函数111进行重载,可使通过同名的函数功能变得更加强大
c++引入了名字空间,可以使定义的变量名更多
c++可以使用引用传参,应用传参比起指针传参更加快,指针传参还需要传送,而引用传参不需要传送参数,就能使函数共用一个变量
c++使用了类,能够继承,继承使得定义相似的类时能够直接从上一层得到一些方法或变量来进行直接使用
c++相比c语言功能强大的同时,也带来了更复杂多阳光的语法,这对于初学者来说是一个大的难点,这也使得c++在编程和学习上的难度提高了,并且c++的效率依然不如c语言,c语言适合底层开发,c++适合c/s的软件开发 c/s client/server
c++是在c语言的基础上扩展而来的,所以c++完全兼容c语言,可以在c++程序中写c语言的代码
c++文件后缀: .cpp .h .cc .cxx .hpp 编译的时候需要使用c++编译器(g++)
标准c++头文件是不带.h
在c++中使用标准c库 (cstdio),把标准的c库头文件.h去掉在前面添加c
c++中使用c语言库函数
第三种写法
extern "C"
{
//标准c库函数的头文件
#include
//自定义的第三方C库头文件
//也就是使用的c编译好的库对应的头文件
#include "add.h"
}
编译动态库(lib(*).so) gcc -fpic -shared *.c -o lib(*).so
面试题:在c++程序中,引用c程序或者extern“C”的作用是什么
主要作用就是为了能够正确实现c++代码调用其他c语言代码,加上extern “C”后,会指示编译器这部分代码按C语言的进行编译,而不是c++
#include
linux下,头文件的位置: /usr/include/c++/7
标准输入(standard input)与预定义的istream的对象cin对应
标准输出(standard output)与预定义的ostream对象cout对应
标准出错(standard error)与预定义的ostream对象cerr对应
以上的 标准输入 标准输出 标准出错 存在于命名空间 std 中,所以在使用的时候要指明命名空间
在使用的时候,指明cin是来自std命名空间
cin >> 变量 --------不需要指定类型(基本数据类型是自动识别)(可以连续输入)
cout
std::endl 代表换行 相当于 “\n”
自适应数据类型(不像c语言需要通过格式控制符来区别)
可以连续操作(可以连续输入输出,自动区分数据类型)
1)使用标准输出cin、标准输出cout,endl之前一定要加上命名空间(除非在使用之前将std命名空间全部打开)
2)使用的时候 重载> 不要写反了
3)在使用标准输入的时候 不能在后面加std::endl
1、赋值初始化
int val = 100;
2、直接初始化
int val(100)
用来存储地址的变量,在c语言中,如果地址类型不一致,只会报警告,而在c++中会更为严格会直接报错,所以在c++中类型必须要一致
c语言: int* p = 0x123456789; //左边是int*类型,右边是int类型,类型不一致会警告 c++: int* p = 0x123456789; //直接报错 必须强制转换为相同类型 int* p = (int*)0x123456789; 说明:c++对数据的类型比c语言更加的严谨
1)c/c++申请的方式
c语言方式 -- 函数
申请堆空间 malloc callloc realloc
释放堆空间 free
c++语言的方式 ---运算符(关键字)
申请堆空间 new ------->> malloc+构造函数
释放堆空间 delete -------->> free+析构函数
2)申请格式
1 数据类型 *变量名 = new 数据类型;
2 数据类型 *变量名 = new 数据类型(初始值); //申请内存空间的时候直接初始化
3 数据类型 *变量名 = new 数据类型【数据元素个数】
3)释放格式
1 delete 指针变量; 释放单个变量
2 delete 【】指针变量; 释放多个变量
总结:
1、C语言中的malloc free 是函数,c++语言中的new delete是运算符
2、new在申请内存的同时,还会调用对象的构造函数,而malloc只会申请内存,同样,delete在释放内存之前,会调用对象的析构函数,而free只会释放内存
如何在一个cpp文件中定义相同变量名的两个全局变量
使用命名空间区分这两个全局变量
命名空间就是类似一个黑盒子
作用:防止名字冲突
格式:
namespace 命名空间名字
{
//声明定义变量
//声明定义函数
//定义结构体/共用体/枚举 数据类型
//声明类 定义对象
}
使用命名空间中的成员
1)引入整个命名空间 -----将这个盒子全部打开 using namespcae 命名空间名字;
2)引入命名空间的某个成员 ------将这个盒子中某个成员的位置打开 using 命名空间名字::成员名;
3)调用的时候指定是哪一个命名空间下的成员 cout<<命名空间名字::成员名
命名空间可以分开定义,也就是说,你在定义一个命名空间之后,如果后面想要这个命名空间里面再次添加某些数据成员或者函数成员,可以再次接着定义
namespace { int data = 100; }
可以在本文件中直接使用data,限制空间中的成员只能在本文件中使用,类似c语言中的static修饰
概念:引用就是一个变量或者是常量的别名,对引用的操作与对变量直接操作完全一样。应用是一种关系型声明的类型,说明它跟别的变量的关系,它所声明的变量不占内u车内空间,通俗来讲,是已有变量的别名,来说明跟已有变量的关系,所以引用变量的类型要跟已有变量的类型保持一致
在c++中,引入引用类型,可以通过reference(引用)给已有变量取别名,那么已有变量名和别名都代表这同一块内存空间的别名,所以不会分配空间给引用变量
在编程语言中,类型的本质是固定内存大小的别名,变量的本质是连续内存大小的别名
定义格式:
以前的指针:数据类型* 指针名 = &变量
现在的引用:数据类型 & 引用名 = 变量(数据类型必须与变量类型一致,而且必须要初始化)
引用特点:
1、&在定义的时候不是取地址运算符,而是起标识作用,表示给某个变量或者常量起一个别名,所以引用不是变量
2、在定义引用的时候,数据类型指的是 目标变量或者常量的数据类型
3、定义引用的时候,必须同时对其进行初始化
4、引用定义完毕后,相当于目标变量有两个名称,也就是目标原变量名和引用名,直接使用引用名就相当于直接操作该目标变量对应的内存空间
5、引用定义完毕后,不能再把该引用名作为其他变量名的别名
6、引用本身不占存储单元,仅仅是作为变量的别名。对引用求地址,就是对目标变量求地址。&ra与&a相等
7、不能建立引用的数组,因为数组是一个由若干个元素所组成的集合,所以无法建立一个由引用所组成的集合,但是可以建立数组的引用
8、如果引用的对象是常量,那么引用必须用const修饰
引用与常量
1、将一个引用设置为常量后,不能通过该引用修改数据,但仍可通过被引用的变量来改变
2、被引用的数据是常量,引用本身也必须是常量
引用的应用
1、引用作为参数(值,地址,引用)
引用的一个重要作用就是作为函数的参数。
c语言阶段 如果在某个函数中想要改变另一个函数的变量,则需要进行地址传递,现在c++阶段又新增了一个引用传递,同样也能在一个函数中修改另一个函数的变量
2、引用作为函数的返回值
格式:
返回值数据类型 & 函数名(形参列表及类型说明){}
特点:
1、以引用的i形式返回函数值,定义函数时需要在函数名前加&
2、用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本
3、不能返回局部变量的引用,因为局部变量在函数调用结束之后内存空间就被释放了
4、如果一个函数的返回值是一个引用,那么函数可以调用可以作为=的左值
引用和指针的区别
1、引用不占用内存空间,指针占用内存空间
2、引用是原来变量的一个别名,跟原来变量实质使用一个东西,指针是一个变量,存储的是一个地址
3、引用只能是一级,但是指针可以有多级指针(**p)
4、引用在定义的时候必须初始化,指针可以不用初始化
5、引用不能是空,指针可以是空(NULL)
6、引用在被初始化后就不能被修改,但是指针可以修改指向内存空间
7、在使用sizeof()函数后返回值可能不同,sizeof(a)和sizeof(p)
即两个都是用sizeof测量后,引用随数据类型不同返回值不同,但是指针的值不会改变
8、自增以后的值不同:a++相当于val++ p++代表p指向val后面的那个内存空间
9、引用在作为函数参数时,可以不用检查;但是指针在作为函数参数的时候需要检查是否为空
总结:
引用传递的性质像指针传递,书写形式像值传递
如果只需要借用一个别名,就没必要用指针