c++简介、c++与c的一些区别、命名空间、堆内存空间管理

C++介绍

本贾尼.斯特劳斯特鲁普,于1979年贝尔实验室,在分析UNIX系统的流量时特别希望有一个模块化的工具,于是在C语言的基础上开发一种新的编程语言,就是C++。

第一个C++程序

#include <iostream>
using namespace std;

int main(int argc, char const *argv[])
{
    cout << "Hello World!" << endl;
    return 0;
}

C++的堆内存管理

1、C++中专门管理堆内存的语句,而C语言中只能使用标准库的函数来管理堆内存。
    new 分配内存,相当于C语言中的malloc
    delete 释放内存,相当于C语言中的free
2、new和delete的使用方法  
    类型* p = new 类型; // 分配一块内存
    注意:new会自动计算字节数,且返回的是有类型的地址。
    delete p; // 释放内存
    类型* p = new 类型[n]; // 分配n块连续的内存
    delete[] p; // 释放n块连续的内存
    注意:new/delete 和new[]/delete[] 不能混用。(对应使用)
3、new/new[]分配内存时可以对内存进行初始化。
    int* p = new int(12345);
    int* p = new int[5]{0,1,2,3,4}; // -std=gnu++11
4、new/delete不能与malloc/free混用
    因为new和delete会自动调用结构、联合、类的构造和析构函数,而malloc不会,如果混用会造成析构和构造的不匹配,可能会引起段错误或内存泄露。
    new[n] 会自动调用n次构造函数
    delete[] 会自动调用n次析构函数,原因是C++编译器会在所申请到内存的前4个字节记录,内存块数。
5、new/delete的特殊情况
    new分配内存失败时,不会返回空指针,而是产生std::bad_alloc异常。 
    delete 可以释放空地址,但不能重复释放同一块内存,否则会产生 double free or corruption的错误。
6、new/malloc的参数与返回值
    new 需要的参数是类型,带类型的地址。
    malloc 需要的参数是字节数,void*类型的地址。

C++与C的区别

    1、C++完全兼容C语言
    2、C++支持面向对象的编程思想
    3、C++支持运算符、函数重载
    4、C++支持编译时、运行时多态
    5、C++支持泛型编程(模板)
    6、C++支持异常处理
    7、C++类型检查更严格

c到c++

1、文件扩展名由.c变成.cpp .cc .C .cxx
2、编译器由gcc变为g++,但gcc也可以继续使用,需要添加 -xc++ -lstdc++参数
3、C++头文件不带.h,C语言中的头文件还可以继续使用,C标准库中的头文件可以去掉.h文件名前加c,如:stdio.h cstdio。
    iostream 意为input output stream,C++中把输入输出被封装成了流操作。
4、输入、输出
    cout << 数据 << endl;
    cin >> 变量;
    不需要占位符,可以自动识别数据类型。
    cin与scanf类似遇到空格就结束,所以需要输入带空格的字符串的时候不要用cin。
    printf/scanf还可以继续使用
    cout/cin类对象,printf/scanf是标准库函数
5、增加了命名空间,是C++中解决命名冲突的一项技术。

C++和C数据类型的不同

结构的不同

    1、不再需要 typedef 关键字对结构进行重定义,设计好结构后,定义结构变量时不再需要struct关键字。
    2、结构体的成员可以是函数,在成员函数中可以直接访问成员变量,不需要.或->。
    3、结构体中有一些隐藏的成员函数(构造、析构、拷贝、赋值)。
    4、可以给成员设置访问属性
        public      公开
        protected   保护
        private     私有
        结构体中的成员默认是public
    5、可以继承其它结构体,也可以被其它结构体继承。
    6、空结构体大小为1字节。

联合的不同

    1、不再需要 typedef 关键字对结构进行重定义,设计好联合后,定义联合变量时不再需要 union 关键字。
    2、联体体的成员可以是函数,在成员函数中可以直接访问成员变量,不需要.或->。
    3、联合体中有一些隐藏的成员函数(构造、析构、拷贝、赋值)。
    4、可以给成员设置访问属性,成员默认是public
    5、不可继承其他联合体

枚举的不同

    1、不再需要 typedef 关键字对结构进行重定义,设计好枚举后,定义枚举变量时不再需要 enum 关键字。
    2、不能与整数数据进行转换,不能用整数数据直接给枚举变量赋值,必须使用枚举值。

bool类型的不同

    1、不需要再添加stdbool.h头文件,是一种真正的数据类型。
    2、bool true false 是C++中的关键字。(新增3个关键字,c语言32个)
    3、在C++中true、false是1字节,而在C语言中是4字节。

void*不同

    1、void*类型的地址不能再直接赋值给其它类型的指针(为了安全)。
    2、但其它类型地址可以赋值给void*类型的指针,否则C标准库和系统中的大部分函数无法再使用。

字符串不同

    1、C语言中没有处理字符串的相关语句,只能使用标准库中的函数。
    2、C++中把字符串封装成了string类
        = strcpy
        += strcat
        == strcmp
        .size() strlen
        [] 访问单个字符
        .c_str() 转换成 const char* 给C语言中的函数传参
    3、string类封装在string头文件中,但该头文件已经包含在iostream头文件中,且属于std空间。

C语言中的malloc/free与C++中的new和delete的相同点和不同点。

	左边是new/delete,右边是malloc/free
    不同点:
    身份:运算符/关键字     C标准库函数
    返回值:带类型的地址    void*
    参数:类型              字节数
    失败:抛异常            返回NULL
    构造/析构:自动调用     不调用
    初始化:可以            不可以
    头文件:不需要          stdlib.h
    相同点:
    都可以管理堆内存
    返回值都是地址
    都可以释放空指针
    都不可以重复释放

命名空间

1、为什么需要命名空间
    由于C++完全兼容C语言,C标准库和C++标准库中自带的有大量的类、函数,且C++支持继承语法也可能包含其它很的类,因此导致全局的标识局大量增加,因此命名冲突的风险也就大大增加,因此需要一种新的解决命名冲突的技术。
2、什么命名空间
    C++中设计一种对全局作用域进行再次划分逻辑作用域,是一种新的解决命名冲突的技术。
    namespace 空间名
    {
        全局变量
        函数
        结构、联合、枚举
        类
    }
3、如何使用
    1、域限定符
        空间名::标识符
    2、导入名字空间
        using namespace 空间名;
4、命名空间的合并
    命名空间可以多次定义,编译器会自动加不同位置的命名空间自动合并。
5、声明和定义可以分开
    a.h 声明
    namespace ns{
        extern int b;
    }

    a.cpp 定义
    namespace ns{
        int b;
    }
    或
    int ns::b;

6、匿名空间
    所有的全局标识符都归属于一个没名字命名空间,也叫匿名空间,匿名空间默认是被直接导入的,如果被局部或块标识符屏蔽,可以使用 ::标识符来访问全局的标识符。

7、命名空间可以嵌套
    namespace n1{
        int num;
        namespace n2{
            int num;
            namespace n3{
                int num;
            }
        }
    }
    1、逐层分解
        n1::n2::n3::num;
    2、逐层导入
        using namespace n1::n2::n3;
        cout << num << endl;
    3、给命名空间取别名
        namespace n123 = n1::n2::n3;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值