cpp基础学习笔记01

C和C++的区别

1.语言类型:C 是一种过程性编程语言,着重于以函数为基础的结构化编程;而 C++ 是一种多范式编程语言,支持面向对象编程(OOP)和泛型编程等多种编程范式。

2.对象模型:C++ 支持类和对象的概念,可以通过封装数据和成员函数来实现面向对象编程。而在 C 中,没有直接支持类和对象的特性,只能通过结构体和函数来模拟。

3.标准库:C++ 在标准库方面相比 C 更加丰富。除了包括 C 标准库外,C++ 还提供了标准模板库(Standard Template Library,STL),其中包含了许多容器、算法和迭代器等可复用的组件,能够极大地简化开发过程。

4.面向对象特性:C++ 支持封装、继承和多态等面向对象编程的特性,使得代码可以更加模块化、可维护和可扩展。而在 C 中,没有原生的支持这些特性,需要手动进行实现。

5.异常处理:C++ 提供了异常处理机制,允许程序在出现错误时抛出异常,并通过异常处理语句进行捕获和处理。而在 C 中,通常使用错误码等方式来处理错误。

6.函数重载:C++ 支持函数重载,即可以定义多个同名函数,但参数类型、个数或顺序不同。这样可以根据具体的情况选择合适的函数进行调用。而在 C 中,函数重载是不允许的。

7.名称空间:C++ 引入了命名空间(namespace)的概念,可以避免命名冲突,在不同的名称空间中定义相同名字的函数和变量。C 中没有命名空间的概念

指针和引用

        相同点:

        1. 可以用于访问内存中的变量或对象。

        2. 可以作为函数参数,传递变量或对象的引用或地址。

        3. 可以用于动态分配内存,并在程序中进行内存管理。

        4. 可以用于实现数据结构,如链表、树等。

        5. 可以作为成员变量出现在类中,并用于实现类的数据成员和成员函数。

    不同点:

        1. 内存模型不同: 指针是一个变量,它存储着一个内存地址,而引用是一个别名,它是已经存在的变量或对象的别名。因此,指针本身占据内存空间,而引用不占用内存空间。

        2. 指针和引用的自增(++)运算符意义不同,指针是对内存地址自增,而引用是对值的自增。

        3. 指针需要解引用,引用使用时无需解引用(*).

        4. 指针可以为空,引用不能为空。

        5. “sizeof 指针”得到的是指针本身的大小,在32 位系统指针变量占用4字节内存,“sizeof 引用”得到的是所指向的变量(对象)的大小。

重载,重写,隐藏

#include <iostream>
using namespace std;
class A {
public: void Max(int a, int b){}
};
class B : public A{
public: int Max(char a){return 0;}
};
int main() {A Atest;Atest.Max(1,2);B Btest;Btest.Max('a'); //  正确调用Btest.Max(1,2); //  编译出错,虽然基类中的函数符合它的传入参数形式,但是基类中符合它类型的函数已经被隐藏了return 0;
}

new/delete,malloc/free的区别

1. new/delete是C++的关键字,操作符,可以被重载

2. malloc/free是C的库函数,不可以重载

3. malloc需要自己显示计算分配内存大小,new则由编译器计算

int *q = (int*)malloc(sizeof(int) * 2);int *p = new int[2];

4. malloc分配成功后返回的是void*指针,需要强制转换;new会直接返回对应的指针。

5. new/delete会调用构造,析构函数,malloc/free只会申请,释放内存,不调用构造/析构函数。

补充:delete,free后,需要将指针指向nullptr/NULL,因为内存不会立刻回收。

inline函数

1. 内联执行的内容,直接写在了调用处。

2. 不用像函数调用一样,直接执行函数体。

3. 相比较于宏,多了类型检查

4. 不能包含复杂操作,循环,递归,switch等。

5. Class中的函数,除了虚函数,自动隐式定义为内联

优点:

    1. 直接在调用处代码展开,省去了参数压栈,回收等。

    2. 代码展开时,相比较于宏,会做安全检查,自动类型转换

    3. Class内自动转换为内联,可以访问成员变量

    4. 可以调试,宏不行

this指针

        隐含于非静态成员函数。this是一个右值,不可以取地址(&this不可以)。

堆和栈的区别

1. 栈,编译器管理;堆,用户管理;

2. 空间大小不同

3. 生长方式不同

4. 堆都是动态分配;栈有静态分配(编译器完成,比如局部变量),动态分配

静态全局变量、全局变量

1. 都位于常量区

2. 静态全局变量只在本文件中有效,别的文件无法使用;全局变量可以在别的文件中使用。

3. 不同文件不可以定义相同名称的全局变量。

静态局部变量和局部变量

1. 静态局部变量在常量区,局部变量在栈区

2. 静态局部变量作用域结束后,不会销毁,程序结束后才结束。

3. 静态变量初始值为0,局部变量是随机值

4. 静态局部变量编译时只赋值一次,以后每次调用相同函数,都不再赋值。

源代码如何变成可执行文件:预处理,编译,汇编,链接

预处理:删除所有的#define,处理所有条件预编译指令,如: #if, #ifdef, #else等。删除所有注释,添加行号,文件标识。.c文件 => .i文件

编译:编译器负责,词法分析,语法分析,语义分析等,最终生成目标机器代码, .s文件

汇编:将汇编语言转换为机器可以执行的语言(0,1组成),形成目标文件.o

链接:通过链接器将多个目标文件链接,生成可执行文件,连接器主要负责地址重新分配,符号名称绑定,重定位等。

map是否可以使用结构体作为key?

map自动排序,所以一般是不可以的,需要对<进行运算符重载。

如何定义一个只能在堆上(栈上)生成的类

    只能在堆上:方法:将析构函数设置为私有。

    原因:C++是静态绑定,编译器管理栈上对象的生命周期,编译器在为类分配空间时,会优先检查析构函数访问性,如果析构函数不可以访问,则不可以在栈上创建对象。

    只能在堆上:方法:将new和delete重载为私有。

delete this是否合法

    1. 必须保证this是new出来的。

    2. delete this是最后一个调用this的语句。

如何判断程序是大端,小端

大端:高字节在低位(符合人的思维)

int main()
{short a = 0x1023;char b = static_cast<char>(a);if(b == 0x12) // 大端else if(b == 0x34) // 小端
}

内存分区模型

    代码区:存放函数体的二进制代码,由操作系统进行管理

    全局区:存放全局变量,静态变量以及常量

    栈区:由编译器自动分配释放,存放函数的参数值,局部变量

    堆:程序员分配释放

程序运行前:

    编译生成可执行文件后,未执行该程序前分为两个区域:

    代码区:存放CPU执行的机器指令,代码区是共享的,代码区是只读的。

    全局区:全局变量,静态变量存放在此。

程序运行后:

    栈区:由编译器自动分配释放,存放函数的参数值,局部变量。

extern "C"作用

按照C语言的方式编译,比如C是不支持重载的。

C++中struct和class的区别

1.权限分为成员访问权限和继承权限

默认成员权限:class是私有的,struct是公有的

默认继承权限:class是private,struct是public

2.class可以定义模板参数  template<class  T>,而没有template<struct T>

3.C语言中:struct是用户自定义数据类型(UDT);C++中struct是抽象数据类型(ADT),支持成员函数的定义,(C++中的struct能继承,能实现多态)

C中struct是没有权限的设置的,且struct中只能是一些变量的集合体,可以封装数据却不可以隐藏数据,而且成员不可以是函数。

C++中,struct增加了访问权限,且可以和类一样有成员函数,成员默认访问说明符为public(为了与C兼容)。

struct作为类的一种特例是用来自定义数据结构的。一个结构标记声明后,在C中必须在结构标记前加上struct,才能做结构类型名(除:typedef struct class{};);C++中结构体标记(结构体名)可以直接作为结构体类型名使用,此外结构体struct在C++中被当作类的一种特例。

nullptr和NULL

在C语言中,NULL是宏定义,nullptr是C++ 11的关键字。

//C语言中NULL定义
#define NULL (void*)0   //c语言中NULL为void类型的指针,但允许将NULL定义为0//c++中NULL的定义
#ifndef NULL
#ifdef _cpluscplus     //用于判定是c++类型还是c类型
#define NULL 0         //c++中将NULL定义为整数0
#else
#define NULL ((void*)0)      //c语言中NULL为void类型的指针
#endif
#endif

c++中int *p=NULL; 实际表示将指针P的值赋为0,而c++中当一个指针的值为0时,认为指针为空指针。

strlen和sizeof的计算

1. strlen函数只可以以char*为参数,返回str的长度,不包括'\0'。

2. sizeof,计算实际字节数

    const char* s1 = "0123456789";std::cout << sizeof(s1) << std::endl;   // 根据编译器,返回地址字节数std::cout << sizeof(*s1) << std::endl;  // 第一个字符字节数,1std::cout << strlen(s1) << std::endl;   // s1的长度,10#######################################################################const char s2[] = "0123456789";		// 动态数组std::cout << sizeof(s2) << std::endl;	// 11, 计算的是整个数组大小,会算上'\0'std::cout << strlen(s2) << std::endl;	// 字符串长度,10std::cout << sizeof(*s2) << std::endl;	// 1,计算第一个字符#######################################################################const char s3[100] = "0123456789";std::cout << sizeof(s3) << std::endl;	// 100, 实际分配的内存大小std::cout << strlen(s3) << std::endl;	// 10, 字符串长度#######################################################################int s4[100] = { 0,1,2,3,4 };	// int 4字节, 400字节std::cout << sizeof(s4) << std::endl;#######################################################################char p[] = { 'a', 'b', 'c', 'd' };char q[] = { 'a', 'b', '\0', 'c', 'd'};std::cout << sizeof(p) << std::endl;	// 4字节std::cout << strlen(p) << std::endl;	// ??不确定,随机数std::cout << sizeof(q) << std::endl;	// 4字节std::cout << strlen(q) << std::endl;	// 2, 相当于统计了ab

内存对齐

    struct Stu{int i;int j;char k;}Stu test;std::cout << sizeof(test) << std::endl; // 输出12,字节对齐后12,4 or 8的倍数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/707667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

switch其他知识点

1.default的位置在整体输出语句中&#xff0c;放哪都可以&#xff1b; 省略的话结果会不显示&#xff1b; 2.case穿透&#xff0c;还是比较好理解的&#xff0c;因为缺少break导致会把下面的也打印&#xff0c;结果是输出多个 3.switch新特性&#xff1a;是用->减号和大于…

Mysql <=> 安全等于

<> 安全等于&#xff0c;为NULL安全的等值比较运算符&#xff08;NULL-safe equal&#xff09;&#xff0c;该操作符作用类似“”。 区别为当符号两边出现NULL值时&#xff0c;操作符会返回NULL&#xff0c;而<>会返回1&#xff08;两边操作数都为NULL时&#xff…

柯桥会计培训学校,会计职称考试,考中级会计怎么证明工作年限?

中级会计考试是会计从业人员的重要考试之一&#xff0c;对于中级考生来说&#xff0c;工作年限证明是必不可少的一步。因此&#xff0c;在考中级会计之前&#xff0c;需要对如何证明工作年限进行了解和掌握。 为大家整理了工作年限证明相关信息&#xff0c;一起来看看吧~ 一、…

Rocky Linux 运维工具 ls

一、ls 的简介 ​​ls​ 用于列出当前目录下的文件和目录&#xff0c;以及它们的属性信息。通过 ​ls​命令可以查看文件名、文件大小、创建时间等信息&#xff0c;并方便用户浏览和管理文件。 二、ls 的参数说明 序号参数描述1-a显示所有文件&#xff0c;包括以 ​.​开头的…

java单元测试技巧

Test装饰器指定断言类型 在JUnit 4中&#xff0c;你可以使用expected属性在Test注解中声明期望的异常类型。如&#xff1a; Test(expected Exception.class) public void testSqlSessionFactoryBeanWithNullDataSource() throws Exception {

5G双域快网

目录 一、业务场景 二、三类技术方案 2.1、专用DNN方案 2.2、ULCL方案&#xff1a;通用/专用DNNULCL分流 2.3、 多DNN方案-定制终端无感分流方案 漫游场景 一、业务场景 初期双域专网业务可划分为三类业务场景&#xff0c;学校、政务、文旅等行业均已提出公/专网融合访问需…

Spring MVC HandlerAdapter原理解析

在Spring MVC框架中&#xff0c;HandlerAdapter&#xff08;处理器适配器&#xff09;是一个非常重要的组件&#xff0c;它负责调用处理器&#xff08;Handler&#xff09;来处理客户端的请求。HandlerAdapter在请求处理流程中起到了桥梁的作用&#xff0c;连接了DispatcherSer…

【DDD】学习笔记-领域驱动设计对持久化的影响

资源库的实现 如何重用资源库的实现&#xff0c;以及如何隔离领域层与基础设施层的持久化实现机制&#xff0c;具体的实现还要取决于开发者对 ORM 框架的选择。Hibernate、MyBatis、jOOQ 或者 Spring Data JPA&#xff08;当然也包括基于 .NET 的 Entity Framework、NHibernat…

Acwing周赛记录

很难得参加一次周赛hhhhh这次参加的是第144场周赛&#xff0c;一共有三道题 AcWing 5473. 简单数对推理 给定两个整数数对&#xff0c;每个数对都包含两个 1∼9 之间的不同整数。 这两个数对恰好包含一个公共数&#xff0c;即恰好有一个整数同时包含于这两个数对。 给定这两…

选择排序,冒泡排序,插入排序,快速排序及其优化

目录 1 选择排序 1.1 原理 1.2 具体步骤 1.3 代码实现 1.4 优化 2 冒泡排序 2.1 原理 2.2 具体步骤 2.3 代码实现 2.4 优化 3 插入排序 3.1 原理 3.2 具体步骤 3.3 代码实现 3.4 优化 4. 快速排序 4.1 原理 4.2 具体步骤 4.3 代码实现 4.4 优化 为了讲…

linux动态库加载相关

linux下动态库搜索规则 (1)编译目标代码时指定的动态库搜索路径,也就是RPATH&#xff1b; (2)环境变量LD_LIBRARY_PATH指定的动态库搜索路径&#xff1b; (3)配置文件/etc/ld.so.conf中指定的动态库搜索路径&#xff1b;配置完毕后需运行ldconfig命令生效&#xff1b; (4)默…

Linux课程四课---Linux开发环境的使用(vim编辑器的相关)

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

【MySQL】内置函数 -- 详解

一、日期函数 日期&#xff1a;年月日时间&#xff1a;时分秒 1、获得年月日 2、获得时分秒 3、获得时间戳 4、在日期的基础上加日期 5、在日期的基础上减去时间 6、计算两个日期之间相差多少天 7、获得当前时间 ⚪练习 &#xff08;1&#xff09;记录生日 &#xff08;2&…

视频监控简史

安防系统中,视频监控始终是重头戏,是安防系统的核心。 目录 一、起步 二、模拟时代 三、数字时代 四、嵌入式存储 五、视频编码器 六、全数字化监控

Flask入门一(介绍、Flask安装、Flask运行方式及使用、虚拟环境、调试模式、配置文件、路由系统)

文章目录 一、Flask介绍二、Flask创建和运行1.安装2.快速使用3.Flask小知识4.flask的运行方式 三、Werkzeug介绍四、Jinja2介绍五、Click CLI 介绍六、Flask安装介绍watchdog使用python--dotenv使用&#xff08;操作环境变量&#xff09; 七、虚拟环境介绍Mac/linux创建虚拟环境…

家政按摩上门服务小程序搭建

家政按摩上门服务小程序支持技师入驻申请&#xff0c;用户可以通过在线下单预约家政服务&#xff0c;并根据距离、价格、销量好评度等条件进行筛选和选择。用户可以选择技师进行预约&#xff0c;并填写自己的服务地点和时间&#xff0c;享受上门服务。同时&#xff0c;技师也可…

【MySQL】_自连接与子查询、

目录 1. 自连接 2. 子查询&#xff08;嵌套查询&#xff09; 2.1 子查询分类 2.2 单行子查询示例1&#xff1a;查询不想毕业同学的同班同学 2.3 多行子查询示例2&#xff1a;查询语文或英语课程的信息成绩 3. 合并查询 3.1 示例1&#xff1a;查询id3或者名字为英文的课程…

数据分析-Pandas数据探查初步柱状图

数据分析-Pandas数据探查初步柱状图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&am…

在Arcgis中删除过滤Openstreetmap道路属性表中指定highway类型道路

一、导出道路类型并分析 1. 导出道路类型 选中highway属性列&#xff0c;选择汇总→确定 2. 分析 用Excel打开输出表&#xff0c;包含的道路类型如下 0.空值’’ 车辆可行驶道路&#xff08;和bfmap的并集&#xff09; 空值&#xff08;无定义道路&#xff09; 二、…

Docker - compose常用命令(常规操作顺序)

----------------------------------------------------------【Docker】-------------------------------------------------------------------- 【本地部署】 构建Docker镜像 docker build -t your-image-name .运行容器 docker run -p 8080:8700 your-image-name , 本地验…