IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 刚刚学完C学习C++的入门级教程 -> 正文阅读

[C++知识库]刚刚学完C学习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++的重点是学习面向对象这种编程思想,而不是花里胡哨的语法

二、C++的第一个程序

#include <iostream>
using namespace std;

int main(int argc,const char* argv[])
{
    cout << "Hello World!" << endl;
    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数据类型的不同点

1、结构的不同

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

2、联合的不同

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

3、枚举的不同

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

4、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

5、字符串的不同

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'为结束标志,编译器可能在末尾加,也可能不加,由编译器决定,因为它的长度信息封装到类的私有成员中

6、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);
     int* p = new int(1234);
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、重复释放
    delete和free一样,都可以释放空指针,但是都不能重复释放相同内存
6、内存分配失败
    malloc分配失败则返回NULL
    new分配失败则会抛出一个异常
    std::bad_array_new_length
7、new和malloc返回值不同
    malloc成功返回void*
    new成功返回有类型的指针

重点掌握:malloc\free 和 new\delete 的区别?
身份:      函数                运算符\关键字
返回值:    void*               带类型的指针
参数:   字节个数(手动计算)      类型   自动计算字节数
处理数组:手动计算数组总字节数    new 类型[数量]
扩容:      realloc             不好直接处理
失败:      返回NULL            抛异常并结束
构造\析构:  不调用               自动调用
初始化:    不能初始化            new 类型(val)
头文件:    stdlib.h             直接使用
重载:    不允许重载               允许
分配内存位置:
            堆内存               自由存储区
注意:自由存储区只是一个抽象的概念,由于new底层默认调用malloc,此时分配的是堆内存,但是new可以当做运算符被程序员重载或者 new(地址) 的方式分配内存时,可能会被分配到其它任意的区域,取决于括号内的地址是哪个段
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 00:33:07  更:2022-09-30 00:35:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 6:40:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码