C/C++基础概念、代码应用实例超详细总结

您所在的位置:网站首页 c加加三大特性 C/C++基础概念、代码应用实例超详细总结

C/C++基础概念、代码应用实例超详细总结

2024-07-03 16:05| 来源: 网络整理| 查看: 265

写在前面

0.适合小白,和基础不牢的

1.本文很多代码都是图片,但都是完整能运行的;避免有人复制,而不去亲自去敲代码实验;其实,自己敲出来的掌握更牢,看别人的,始终是别人的。

2.本文比较全面回答了学习C/C++过程一些基本概念的疑问;通过化抽象为具体,不去刻意记忆定义,而是去理解定义,能用自己的话表达出来。

3.一定程度上针对面试准备的,不会粘贴大量生硬死板的定义和一些废话,每个概念都有自己的理解以及对应的代码实例。

4.从归类,从大框架到细枝末节的总结方式呈现

5.最终会出一个框架图搭建知识体系网络(未完)

目录

1.c++面向对象如何理解?与面向过程有何不同?

2.那是不是什么都往面向对象上靠,一切可对象化?

3.与c语言有什么不同?相比较的优点是什么?   

1.引用和指针的区别? 

引用举例: 

引用 Vs 指针

 引用应用举例:

2.C++ 标准库、C标准库

0.C标准库(都有哪些头文件)

 1.C++编译环境

2.C++标准库组成 

3. malloc/free和new/delete差别:

new/delete  vs  malooc/free 

new对象和直接定义对象有何不同? 

什么时候要用到new 和maolloc呢 ?

应用举例 

 构造函数,拷贝构造函数、operator=函数

4.结构体和类?

结构体声明、定义、初始化(这里c 、c++里略有不同,见加粗标红)

类声明(前置声明举例和注意点)、定义、实现

Q:什么时候可以不用include一个文件呢

4.C++三大特性是什么?如何理解?

  1.封装:在我看来 最主要的功能就是:    安全:1.隐藏细节 2.代码保护(权限控制)            

  2.继承:可以联想子承父业         

     3.多态:我理解为同一信号,不同事物会做不同的反应           

纯虚函数理解: 

5.静态成员函数、静态成员,静态函数、外部函数(extern)

关于const

应用代码展示: 

 内部函数 VS 外部函数 

extern用法:

应用举例:

​ 至于以上疑问:为什么函数加不加extern不报错,变量就必须加上才编译成功呢?

6.友元函数、友元类

7.运算符重载

 应用举例

​ 为什么输入输出运算符重载需要声明为友元函数?

8.模板应用

函数模板定义的一般形式如下:

 应用举例:

 类模板定义的一般形式如下:

9.STL解析及应用

10.C++设计模式

1.c++面向对象如何理解?与面向过程有何不同?

        要理解面向对象,必须先理解面向过程,因为面向对象就是为了解决面向过程编程的一些繁杂和缺点(比如代码量大时容易命名冲突,代码重复等);这里推荐如何通俗易懂地举例说明「面向对象」和「面向过程」有什么区别? - 知乎   

以下个人理解,有误请指出:

         简言概括就是将 现实一类事物高度抽象化,将其抽象为一个有内容(数据)和动作(函数方法)的“活物”,我们无需亲力亲为去做一件事,而是让这个活物去做。不使用这个活物只能说你抽象出了一个类,使用它就是在面向对象了 

站在计算机程序角度来讲,面向过程和面向对象的本质理解为:

        1.面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行

        2.面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。

        3.面向对象也可以说是从宏观方面思考问题,而面向过程可以说是从细节处思考问题

2.那是不是什么都往面向对象上靠,一切可对象化? 如果你的工程简单,根本不需要解决分类,命名,代码重复等问题,你就不需要非得面向对象编程 3.与c语言有什么不同?相比较的优点是什么?    面向对象多了个好用的引用C中用const修饰的变量不可以用在定义数组时的大小,但是C++用const修饰的变量可以。C++管理内存方式是对比C较为安全的new/delete 1.引用和指针的区别?  引用的概念

         引用不是定义一个变量,而是给一个已有成员起一个别名。类型 &引用变量名 = 以定义的变量名

int a = 10; int &b = a;  引用的特点  

             1.一个变量可以有多个成员

             2.引用必须初始化

             3.引用只能在初始化的时候引用一次,不能改变在引用其他的变量

引用举例: 

引用 Vs 指针  现象上:

 1.指针可以不进行初始化,引用必须初始化(因为要知道到底要给谁起别名)

 2.指针的值(即地址)可以可以改变,但引用给某个对象起的别名,不能再用在别处,即引用的值不能被改变

 3.指针是一个实体,需要分配内存空间。引用只是变量的别名,不需要分配内存空间。

 4.引用访问一个变量是直接访问,而指针访问一个变量是间接访问

(无论何时记住,操作别名就等同操作绑定对象,而直接操作指针是地址,操作指向对象要解引用)

其他

  5.从理论上来说,对于指针没有级数限制,但是引用只有一级

  6.sizeof(指针)的大小是固定的(和编译器位数有关),而sizeof(别名)是绑定对象的大小

  7.引用较指针更为安全(说实话举不出来例子,只是觉得他一旦绑定了一个对象,就不会再改变,所以安全?有理解深刻的可以留言)

 引用应用举例: 作为参数传递

        使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;

        而使用一般变量传递函数的参数,当发生函数调用时,需要给 形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效 率和所占空间都好。

#include #include //strtol头文件 void swap1(int * x,int *y) { int temp = *x; *x = *y; *y = temp; printf("*x:%d *y:%d\n",*x,*y); } void swap2(int &x,int &y) { int temp = x; x = y; y = temp; printf("x:%d y:%d\n",x,y); } int main() { int a1 = 10,a2 = 20; swap1(&a1,&a2); swap2(a1,a2); system("pause"); return 0; }  常引用

  常引用声明方式:const 类型标识符 &引用名=目标变量名;

  用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。

int a ; const int &ra=a; //ra=1; //错误,不允许通过别名对他进行操作 a=1; //正确 int b = a;//只能拿来用,不能拿来修改 printf("b: %d\n",b);//结果:1

    引用型参数应该在能被定义为const的情况下,尽量定义为const 。

函数返回引用

       类型标识符 &函数名(形参列表及类型说明){函数体}

  说明:

  (1)以引用返回函数值,定义函数时需要在函数名前加&

  (2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。

#include #include //strtol头文件 int yinyong0(int x) { int sum = x*x; return sum; } int & yinyong1(int x) { int sum = x*x; return sum; } int main() { //int & yinyong = yinyong0(10);//错误:不能返回一个局部变量的引用 int & yinyong = yinyong1(10);//ok int yinyong1_1 = yinyong1(10);//ok printf("yinyong: %d\n",yinyong); system("pause"); return 0; } 引用和多态

       引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。

       class  A;        class  B:public A{……};        B  b;        A  &Ref = b; // 用派生类对象初始化基类对象的引用

  Ref 只能用来访问派生类对象中从基类继承下来的成员,是基类引用指向派生类。如果A类中定义有虚函数,并且在B类中重写了这个虚函数,就可以通过Ref产生多态效果。

         

2.C++ 标准库、C标准库 0.C标准库(都有哪些头文件)

1.C++的标准库不仅仅是C标准库的继承,还扩充了不少库函数。(C标准库中大约对应十几个头文件,而C++中有50多个 2.C标准库有哪些?: 它们分别对应一些头文件:

C 标准库 – 参考手册 | 菜鸟教程  用法介绍参考手册

C Standard Library header files - cppreference.com

 1.C++编译环境

            C++语è¨å­¦ä¹ ï¼ä¹ï¼ââC++æ ååºç®ä»

C语言兼容库:头文件带.h,是C++编译器提供商为推广自己的产品,而提供的C兼容库(不是C++标准库提供的),内置的C库。C++标准库:如string、cstdio(注意,不带.h)是C++标准库提供的。使用时要用using namespace std找开命名空间。编译器扩展库:这是针对不同的编译器而独有扩展的,例如g++和vc++,它们在这一板块就不同。C++标准语法模块:C++标准语法的支持。C++扩展语法模块:同样是针对不同的编译器而独有扩展语法。 2.C++标准库组成 

          

C++标准库的特点如下:

A、C++标准库不是C++语言标准的一部分,由类库和函数库组成。 B、C++标准库中定义的类和对象都位于std命名空间中。 C、C++标准库的头文件都不带.h后缀。 D、C++标准库涵盖了C库的功能,(为了支持类型安全,做了一定的添加和修改)

 总之,C++标准库包含C库库的功能,但他俩不是包含关系。只是有相同功能,又不是给覆盖掉了,看你用谁的头文件了。

3. malloc/free和new/delete差别: new/delete  vs  malooc/free 

       new/delete底层是基于malloc/free来实现的

  ①、malloc/free是C和C++语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

  ②、对于非内部数据对象来说,只使用malloc是无法完成动态对象要求的,一般在创建对象时需要调用构造函数,对象消亡时,自动的调用析构函数。而malloc free是库函数而不是运算符,不在编译器控制范围之内,不能够自动调用构造函数和析构函数。而NEW在为对象申请分配内存空间时,可以自动调用构造函数,同时也可以完成对对象的初始化。同理,delete也可以自动调用析构函数。而mallloc只是做一件事,只是为变量分配了内存,同理,free也只是释放变量的内存。

  ③、new可以认为是malloc加构造函数的执行。malloc返回类型为void*,必须强制类型转换对应类型指针;new则直接返回对应类型指针;

  ④、malloc是从堆上开辟空间,而new是从自由存储区开辟(自由存储区是从C++抽象出来的概念,不仅可以是堆,还可以是静态存储区它为自由存储区。这主要取决于operator new实现细节,取决与它在哪里为对象分配空间)

  ⑤、malloc对开辟的空间大小有严格指定,需要我们计算申请内存的大小;而new只需要对象名,可以自动计算所申请内存的大小。

  ⑥、malloc开辟的内存如果太小,想要换一块大一点的,可以调用relloc实现,但是new没有直观的方法来改变。

        7.malloc开辟内存时返回内存地址要检查判空,因为若它可能开辟失败会返回NULL;new则不用判断,因为内存分配失败时,它会抛出异常bac_alloc,可以使用异常机制;

        8.因为new/delete是操作符,它调用operator new / operator delete,它们可以被重载,在标准库里它有8个重载版本;而malloc/free不可以重载;

new对象和直接定义对象有何不同?  C++里面, 创建对象: 声明: ClassName object(初始化参数);在Stack栈里面分配空间,自动释放。 new出来:ClassName object=new ClassNam();在heap堆里面分配空间,要手动释放。 1:声明分配内存是在编译阶段进行的,new分配内存是在运行阶段进行的 2:声明被放在栈中,new被分配在堆中或自由存储区中 3:声明创建数组,在编译阶段是就为他分配内存。 new创建在运行阶段 需要创建时就创建,不需要创建时还可以在运行时选择数组长度 什么时候要用到new 和maolloc呢 ?

当你不知道要创建多少对象的时候,有new比较好,动态分配。 如: int *a=new int[20]; 记得要delete呀 delete [] a;

只要能在栈上创建对象,就在栈上创建;否则的话,如果你不得不需要更长的生命周期,只能选择堆上创建

应用举例  #include #include //strtol头文件 #include //cin cout所需头文件 using namespace std; class student{ public : int math; int english; int chinese; int sum_score; int eval_score; char * hobby; static int count; student() {} ~student()//析构函数 { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3