C到C++

C++

所有的C语言文件都是标准的C++代码

C与C++的区别:

编译器:

​    C:gcc

​    C++:g++

文件:

​    C:.c文件

​    C++:.cpp文件

命名空间

namespace  A

{

}

::域解析符

using : 使后面的关键字生效

std:标准命名空间(standard)

std::cout<<"helloworld "<<a<<" "<<b<<std::endl;

类似于printf(“holleworld”);

输入:cin

C++中的三目运算符可以作为左值来使用,作为左值使用返回值一定不能包含常量

const

C语言中的const修饰的是只读变量,本质是变量,有自己的存储空间,

C++中const修饰的是一个真正的常量,const修饰的常量会被编译器放入到符号表中

const常量是由编译器处理的,提供类型检查和作用域检查,宏定义define是由预处理器处理,是单纯的文本替换

常量指针 : const 修饰的是指针,指针指向可以改,指针指向的值不可以更改

const int *p1 = &a;
p1 = &b;

指针常量 : const 修饰的是常量,指针指向不可以改,指针指向的值可以更改

int * const p2 = &a;
*p2 = 20;    

const 既修饰指针又修饰常量:指针的指向和指针指向的的值都不可以改

const int * const p3 = &a;
p3 = &b      //错误
*p3 = 20;    //错误

& :引用:变量的别名

引用的使用
    引用定义时一定要初始化(不初始化不能用)
    引用不能改变朝向

常量引用:指向右值,也指向左值,但不允许改值

引用除了可以作为函数形参使用,还可以作为函数返回值使用,作为返回值时应注意不能返回局部数据的引用。

引用作为函数返回值的函数,有四种处理方式

1、不接受函数返回值

2、用一个普通函数接收函数返回值,这时接收的是变量的值,而不是变量的引用

3、用一个引用接收函数返回值,接收的是一个应用

4、当成左值来使用

引用 :  本质是指针常量

int * const p;    //指针常量(不能修改指针朝向)  p 不能变

const int * p;    //常量指针(不能修改指针的值) *p不能变

bool 类型: 专门判断真假的类型

true代表真值,1表示。false代表非真值,0表示

函数

内联函数:inline    作用:在编译期将函数调用的地方直接将代码替换

1、C++用内联函数替代宏函数

2、内敛的时机:函数过于复杂不能内联

​    1、任何的循环语句不能内联

​    2、判断语句过多不能内敛

​    3、函数体过于庞大不能内敛

​    4、不能取函数地址

​    5、函数内敛声明必须在调用语句之前

3、函数的默认参数

​    1、默认参数后面一定都是默认参数

​    2、默认参数一定在最右边

​    3、默认参数在声明中定义,在函数定义中不要在定义

4、占位函数:只有参数类型声明,没有参数名声明,函数体内部无法使用占位参数

5、函数的重载 : 相同的函数名,不同的函数实现

目的:方便使用函数名

重载规则:

1、参数数据类型不同

2、参数数量不同

3、参数顺序不同

函数返回值不同不能构成重载

默认参数根据参数数量不同构成重载可能会有歧义 

占位参数可以构成函数重载

nullptr:空指针(NULL重载的时候会出现歧义)

跨语言编译:条件编译

当C++引入C的库文件时,头文件声明extern  "C",代表以C的形式编译头文件

new / delete

new会根据后面的数据类型来推断所需空间的大小,还可以根据参数列表对这段空间进行初始化。如果初始化成功,则返回一个指针,如果申请失败,则返回NULL。

new 和 malloc 的区别
     1、malloc是函数, new 是关键字
     2、malloc 需要计算内存大小,new不需要
    3、malloc 需要强转,new不需要
     4、new 申请失败会抛出异常,直接结束程序  new空间不需要判断返回值指针

​     5、new   delete  会调用构造函数和析构函数   malloc和free   不会

new()  delete :单个变量

new []   delete []   : 数组

int * p[2];        //指针数组

int (*p)[2];        //数组指针

struct 

1、结构体名称可以单独作为类型出现

2、内部可以定义函数

class:类(可以看作C语言中结构体struct的升级版)

类的成员不但可以是变量还可以是函数

抽象的作用

抽象是人们认识事物的一种方法,抽象的关键是抓住事物本质,而不是内部具体细节或具体实现。

封装的作用

封装是按照信息屏蔽原则,把对象的属性和操作结合在一起,构成一个独立的对象;通过限制属性和操作的访问权限,将属性“隐藏”在对象内部,对外提供一定的接口,在对象外只能通过接口对对象进行操作;封装增强了对象的独立性,从而保证了数据的可靠型;外部对象不能直接操作对象的属性,只能使用对象提供的服务

继承的作用

继承表达了对象的一 般与特殊的关系,特殊类的对象具有一般类的全部属性和服务。定义了一个类之后,又需定义一个新类,这个新类与原来的类相比,如果只是增加或修改了部分属性和操作,这时可以用原来的类派生出新类,只需在新类中描述自己所特有的属性和操作即可。继承性大大简化了对问题的描述,提高了程序的可重用性,从而提高了程序设计、修改、扩充的效率

多态的作用

多态性是指同一消息被不同对象接收时,产生不同的效果,即实现同一接口,不同方法,在一般类中定义的属性和服务,如果在特殊类中不改变其名字,通过各自不同实现之后,可以具有不同的数据类型或具有不同的行为      

         

面向过程:事物 和行为分离的

面向对象: 事物和行为在一起的

       

计算机内存的五大分区

内存分区模型

代码区:存放函数体的二进制代码,由操作系统进行管理
全局区:存放全局变量和静态变量以及常量
栈区:由编译器自动分配释放,存放函数参数值、局部变量
堆区:由程序员分配和释放,若程序员不释放,系统结束时由操作系统回收
在程序运行前
代码区:
    存放CPU执行的机器指令
    代码区是共享的,共享的目的是对于频繁被执行的程序,只需要内存中有一份代码即可
    代码区是只读的,使其只读的原因是防止程序以外地修改了他的指令
全局区:
    全局变量和静态变量存放在此
    全局区还包含了常量区,字符串常量和其他常量也存放再此
    该区域的数据在程序结束后由操作系统释放

内存四区的意义:不同区域存放的数据,赋予不同的生命周期,给我们更很大的灵活编程

静态变量:在普通变量前面加static ,属于静态变量

static int c = 10;

程序运行后
栈区数据注意事项 ————不要返回局部变量的地址
栈区的数据是由编译器管理开辟和释放的

int * func()
{
    int a =10;      //局部变量, 存放在栈区,栈区的数据在函数执行完后自动释放
    return &a;      //返回局部变量的地址
}

int main()
{
    // 接受func 函数的返回值
    int * p = func();
    std::cout<<*p<<std::endl;       //第一次可以正确打印的数字,是因为编译器做了保留
    std::cout<<*p<<std::endl;       //第二次这个数据就不再保留了
    return 0;
}

堆区
由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
在C++ 中主要利用new在堆区开辟内存
指针的本质也是局部变量,放在栈上,指针保存的数据是放在堆区

new 操作符 : C++中利用new操作符在堆区开辟数据
堆区开辟的数据,由程序员手动开辟,new ;手动释放,释放操作符delete
利用new创建的数据,会返回该数据对应的类型的指针

// 1、值传递
void MySwap01(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
}

// 2、地址传递
void MySwap02(int * a, int * b)
{
    int temp = * a;
    *a = *b;
    *b = temp;
}

// 3、引用传递
void MySwap03(int & a, int & b)
{
    int temp = a;
    a = b;
    b = temp;
}

int main()
{
    int a = 10;
    int b = 20;
    // MySwap01(a, b);  //值传递:形参不会修饰实参
    // MySwap02(&a, &b);    //地址传递:形参会修饰实参
    MySwap03(a, b); //引用传递:形参会修饰实参的
    std::cout<<"a = "<<a<<std::endl;
    std::cout<<"b = "<<b<<std::endl;
    return 0;
}

函数重载

作用: 函数名可以相同, 提高复用性
重载的条件:
同一作用域下; 函数名相同; 函数参数类型不同或者个数不同或者顺序不同
注意 : 函数的返回值不可以作为函数重载的条件

函数重新在需要函数都在同一作用域下

引用作为函数重载的条件

函数重载碰到函数默认参数:调用时只传一个参数时会出现二义性会不知道调用哪个,传两个不会出现错误

void func(int & a)
{
    std::cout<<"func (int &a)调用"<<std::endl;
}

void func(const int & a)
{
    std::cout<<"func (const int &a)调用"<<std::endl;
}

int main()
{
    func(10);
    return 0;
}

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值