C++——基础知识

一、C++简介

本贾尼.斯特劳斯特卢普,与1979年4月在贝尔实验室负责分析UNIX系统内核的流量情况,希望有一款更加模块化的工具,
于1979年10月开始着手开发一种新的编程语言,在C语言的基础上增加了面向对象的机制,这就是C++的来历,在1983年完成了C++的第一个版本

C++与C的重要区别:

    1、C++完全兼容C的所有内容
    2、C++ 支持面向对象的编程思想和机制
    3、C++支持运算符重载、函数重载等编译时多态机制
    4、C++支持泛型编程、模板机制
    5、C++支持异常处理
    6、C++的类型检查更严格

二、C++的第一个程序

	#include <iostream>
	using namespace std;
	
	int main(int argc,const char* argv[])
	{
	    cout <<"Hello World"<< end1;
	    return 0;
	}
1、文件的扩展名由.c 编程 .cpp .cc .C .cxx
2、编译器由gcc编程g++,但gcc也可以继续编译c++文件,需要增加参数 -xC++ -lstdc++
3、C++的标准库不带.h结尾 iostream 意为 in & out stream,在C++中输入、输出被封装流操作,
    C语言中的头文件还可以继续使用,但是建议在C标准头文件名前加c并去掉.h,因为这样的头文件中删除了大量的不使用的宏,并重新添加到名字空间中,防止在C++中命名冲突
4、输入输出
    cout 用于输出
    cin  用于输入
    不再需要占位符,会自动识别数据类型
    printf/scanf 是C语言标准库函数
    cout/cin 是C++标准库中类对象
    endl 负责换行
5、增加了名字空间机制,是C++为了解决命名冲突而发明的一项机制

三、C++与C数据类型的不同点

结构的不同

    a、不再需要typedef关键字进行省略struct,在设计好结构后,定义结构变量时不再需要struct关键字
    b、结构中的结构成员可以是成员变量还可以是成员函数,结构变量、结构指针分别使用 . 或 -> 访问成员函数,在成员函数中可以直接访问本结构的其它成员变量、成员函数,不再需要 . ->
    c、结构中有一些隐藏的成员函数(构造、析构、拷贝构造、赋值函数)
    d、可以给结构成员设置访问属性
        public          公开    (默认)
        protected       保护的
        private         私有的
    e、结构是可以继承其它结构、也可以被其他结构继承

联合的不同

    a、不再需要typedef关键字进行省略union,在设计好联合后,定义联合变量时不再需要union关键字
    b、联合中的成员可以是成员变量还可以是成员函数,联合变量、联合指针分别使用 . 或 -> 访问成员函数,在成员函数中可以直接访问本联合中的其它成员变量、成员函数,不再需要 . ->
    c、联合中有一些隐藏的成员函数(构造、析构、拷贝构造、赋值函数)
    d、可以给结构成员设置访问属性
        public          公开    (默认)
        protected       保护的
        private         私有的

枚举的不同

    a、不再需要typedef关键字进行省略enum,在设计好枚举后,定义枚举变量时不再需要enum关键字
    b、是一种独立的数据类型,不能与整形进行自动隐式转换

bool类型的不同

    a、C++中有真正的布尔类型,bool是C++中的关键字,不需要包含stdbool.h可直接使用
    b、true、false 也是C++中的关键字,但在C语言中都不是
    c、true、false 在C++中是1字节,而在C中是4字节
    注意:无论是C还是C++中bool类型都是1字节,且只存储0|1

字符串的不同

    a、C++中的字符串封装成了string类,但还可以使用C中的字符串,且能与string进行相互转换
    b、string类型被封装在string头文件,但已经被包含到iostream中,属于std名字空间
    c、可以使用string字符串成员函数、还可以使用运算符的方式操作string类,但是C语言中的string.h系列函数还可以继续使用
        =   strcpy
        +=  strcat
        ==  strcmp
        .size() strlen 
        .c_str()    由string转换为char*

    d、C++中没有规定string必须以'\0'为结束标志,编译器可能在末尾加,也可能不加,由编译器决定,因为它的长度信息封装到类的私有成员中

void*的不同

    在C语言中,void*可以与任何类型的指针进行相互转换
    在C++中,void* 不可以自动转换成其他类型的指针,如果需要赋值给其它类型的指针时,只能强制类型转换后才能赋值,为了提高指针访问内存的安全性考虑 
    但是其他类型的指针依然可以自动转换成void*类型的指针,C++之所以保留该功能,是因为C语言标准库、操作系统接口函数采用了大量的void*作为函数参数,如果不保留该功能,C++在调用这些函数时会非常麻烦(mmap\bzero\memcpy\memcmp...)

四、名字空间

1、为什么需要名字空间
    C++完全兼容C语言,C++标准库中自带了大量的类名、函数名、变量名,所以全局的标识符大量增加,命名冲突的风险也大大增加
    
2、什么是名字空间
    C++中增加的一种对命名空间进行逻辑划分单元的技术,称为名字空间,是一种解决命名冲突的机制
    namespace xxx{
        变量名;
        函数名;
        结构、联合、枚举;
        类;...
    }  
    定义出来xxx名字空间形成了一个封闭的作用域
    
3、如何使用
    a、直接全部导入
        using namespace xxx;
        这样在后续代码中可以直接使用xxx名字空间中的所有内容,虽然很方便,但是不建议这样用
    b、域限定符
        xxx::标识符名
        单次访问名字空间中的标识符
        
4、名字空间合并
    同名名字空间可以多次定义,不同位置的同名名字空间会自动合并
    a.cpp
    namespace n1{
        xxx
    }
    b.cpp
    namespace n1{
        yyy
    }
    main.cpp
    using namespace n1;//会把a.cpp的xxx和b.cpp的yyy全部导入
    
5、声明和定义可以分开
    a.h
    namespace n1{
        extern int num; //声明
    }

    a.cpp
    int n1::num = 88;   //定义
    但是注意要加域限定符
    
6、匿名名字空间
    所有的全局标识符都归属于同一个名字空间,它没有名字,称为匿名名字空间,如果没有指定名字空间名,其实默认使用的是匿名名字空间
    匿名名字空间中的成员可以使用  ::标识符 来访问
    所以:同名局部变量屏蔽全局变量时,可以使用 ::变量名来指定访问匿名名字空间中的全局变量
    
7、名字空间可以嵌套
namespace n1{ 
    int num = 10; 
    namespace n2{ 
        int num = 20; 
        namespace n3{ 
            int num = 30; 
        }
    }
}
    采用逐层分解的方式:
        n1::n2::n3::num
    也可以直接导入指定的名字空间
        using namespace n1::n2;

8、给名字空间取别名
    namespace n123 = n1::n2::n3;

五、C++的堆内存管理

1、C++中有专门管理堆内存的语句,而C语言只能标准库中的函数
    malloc\free C标准库函数
    new     分配堆内存  相当于C语言中的malloc
    delete  释放堆内存  相当于C语言中的free
    
    常用格式:类型* p = new 类型; 
              int* p = new int;
2、new分配内存时可以直接对内存进行初始化
    类型* p = new 类型(val);
    
3、new\delete 不能与malloc\free 混合使用 
    int* p =new int;
    free(p);    //语法支持,不应该这样使用
    使用new来分配内存时会自动调用结构、联合、类类型的狗仔函数,
    而使用delete会自动调用这些类型的析构函数,
    但是malloc/free并不会调用构造、析构函数
    
4、数组的分配和释放
    类型* p =new 类型[数量];
    相当于分配连续多块相同类型的内存,类似于C中的calloc
    delete[]专门用于释放通过new[]方式所申请的内存,并且他会自动多次调用析构函数

    注意:new\delete  malloc\free new[]\delete[] 必须不能混用
    使用new[]为结构、联合、类申请到的内存前4个字节,记录了申请的次数,这样的目的为了让编译器在delete[]知道该调用多少次析构函数
    
5、重复释放
    free和delete一样,都可以释放空指针,但是都不能重复释放相同内存
    
6、内存分配失败
    malloc分配失败则返回NULL
    new分配失败则会抛出一个异常 std::bad_array_new_lenth
    
7、new和malloc返回值不同、
    malloc成功返回void*
    new成功返回有类型的指针

malloc\free 和 new\delete 的区别?

			malloc/free		   new/delete
身份:      函数            运算符\关键字
返回值:    void*           带类型的指针
参数:  字节个数(手动计算)   类型   自动计算字节数
处理数组:手动计算数组总字节数  new 类型[数量]
扩容:     realloc          不好直接处理
失败:     返回NULL         抛异常并结束
构造\析构: 不调用            自动调用
初始化:   不能初始化       new 类型(val)
头文件:   stdlib.h           直接使用
函数重载: 不允许重载           允许
分配内存位置:堆内存           自由存储区

注意:自由存储区只是一个抽象的概念,如果new底层默认调用malloc,此时分配的是堆内存,但是new可以当做运算符被程序员重载或者 new(地址)类型 的方式分配内存时,
    可能会被分配到其他任意的区域,取决于括号内的地址是哪个段
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值