C++
文章平均质量分 77
cnhwl
这个作者很懒,什么都没留下…
展开
-
C++ 学习之旅(16)——虚函数与纯虚函数virtual
关于虚函数的概念讲解,可以看这篇文章:https://blog.csdn.net/siwuxie095/article/details/71159414以下用例子进行实际说明:#include <iostream> using namespace std;class Shape {public: int width, height; Shape(int a = 0, int b = 0) { width = a; height = b; } void area()原创 2020-10-04 15:53:50 · 160 阅读 · 0 评论 -
C++ 学习之旅(15)——继承inheritance
所谓继承,就是在原有的类的基础上,通过继承它并添加一些新的成员,从而产生出一个新的类。例如我们在游戏有实体Entity和玩家Player,它们都有位置X,Y和一个移动的方法Move,但不同的是玩家有名字Name,而且可以打印名字。代码如下:class Entity{public: float X, Y; void Move(float x, float y) { X = X + x; Y = Y + y; }};class Player{public: float X,原创 2020-09-30 16:01:41 · 114 阅读 · 0 评论 -
C++ 学习之旅(14)——构造函数constructors和析构函数destructors
首先我们看下一个简单的类:#include <iostream>class Entity{public: float X, Y; void Print() { std::cout << X << "," << Y << std::endl; }};int main(){ Entity e; e.Print(); std::cin.get();}输出结果如下:这个很奇怪的数字,实际上就是系统随机分配的原创 2020-09-30 15:01:30 · 529 阅读 · 0 评论 -
C++ 学习之旅(13)——枚举enum
所谓枚举,作用就是列出一堆数值的集合,然后规定某个变量只能从集合中取值。例如,抛一个骰子,取值只能是1,2,3,4,5,6;交通灯的颜色,只能是red,blue和yellow。enum Dice{ one = 1, two, three, four, five, six};enum Light { red = 0, blue, yellow};在赋值的时候,只要赋了第一个值,后面的就会自动递增。定义枚举类型的变量如下:#include <iostream>enum原创 2020-09-30 11:04:27 · 217 阅读 · 0 评论 -
C++ 学习之旅(12)——static用法小结
(1)在修饰变量的时候,static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。(2)static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以。(3)static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为 0。(4)不想被释原创 2020-09-30 10:32:58 · 191 阅读 · 0 评论 -
C++ 学习之旅(11)——类和结构中的static
当我们使用 static 关键字来把类或者结构成员定义为静态的时侯,无论之后创建多少个类的对象(实例),静态成员都只有一个副本,所有实例都共享这个副本。也就是说,静态成员已经不属于实例了,它归属于类,是一种类普遍存在的属性,而与实例无关。注意我们不能把静态成员的初始化放置在类的定义中,静态成员变量在类中仅仅是声明,没有定义,所以要在类的外面定义,也就是给静态成员变量分配内存。在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化,如下:#include <iostream&g原创 2020-09-29 16:30:47 · 151 阅读 · 0 评论 -
C++ 学习之旅(10)——static与extern
只要你看过我系列中之前关于编译和链接的内容,你就能看懂以下内容,直接上例子:Static.cppint S_var = 5;main.cpp#include <iostream>int S_var = 10;int main(){ std::cout << S_var << std::endl; std::cin.get();}这样Build是会报错的“fatal error LNK1169: one or more multiply de原创 2020-09-29 15:47:12 · 127 阅读 · 0 评论 -
C++ 学习之旅(9)——类Class与结构Struct
类的出现就是把同一类事物的变量和函数组织在一起,让我们可以更方便地对多个相关联的变量进行操作。类是C++独有的,而结构则是从C拿过来的,它们之间只有三个区别:(1)class 中默认的成员访问权限是 private 的,而 struct 中则是 public 的。(2)从 class 继承默认是 private 继承,而从 struct 继承默认是 public 继承。(3)class 可以定义模板,而 struct 不可以。例如定义一个球员类Player,我给他位置x和y,还有速度值speed,方原创 2020-09-29 15:21:08 · 261 阅读 · 0 评论 -
C++ 学习之旅(8)——一文搞懂指针、引用、函数参数的传值调用、指针调用和引用调用
废话少说,直接上代码:#include <iostream>int main(){ int a = 5; int* ptr = &a; int& ref = a; std::cin.get(); //设置断点}为了避免混淆,我建议在定义指针时写int* ptr而不是int *ptr,同理,定义引用写成int& ref而不是int &ref。设置断点,然后Debug程序,看看源程序的汇编程序是什么:精彩的地方来了,指针和引用实际上干的原创 2020-09-29 11:31:43 · 313 阅读 · 0 评论 -
C++ 学习之旅(7)——指针pointer
开门见山,如果把计算机的内存空间比作是一排房子,那指针就是房门号。指针实际上就是一个用来存储内存地址的整数,与类型没有关系,我可以定义一个void类型的指针:#include <iostream>int main(){ int var = 8; void* ptr = &var; std::cin.get(); //设置断点}设置断点后Debug可以看到:到Memory中输入ptr的值可以看到:在4个字节的内存空间中,存放了var的值8。既然指针是一个数,原创 2020-09-29 10:18:11 · 137 阅读 · 0 评论 -
C++ 学习之旅(6)——循环loop
C++中最为常用的三种循环:for循环、while循环和do-while循环,直接上代码:for循环#include <iostream>using namespace std;void Log(const char* message){ cout << message << endl;}int main(){ for (int i = 0; i < 5; i++) { Log("Hello world!"); } cin.get()原创 2020-09-28 13:39:04 · 4618 阅读 · 0 评论 -
C++ 学习之旅(5)——设置Setup文件目录
使用过Visual Studio的朋友都应该知道,VS对于编译后的obj文件以及链接生成的exe文件的存放方式是非常反人类的,所以我们有必要对这个设置进行更改。首先要分清Filter和Folder的概念,在默认的文件目录中,我们看到的实际上是Filter,如下:所谓Filter实际上是虚拟的文件夹,因为即使你看上去把头文件和cpp文件分开了,但是在实际的文件夹中它们仍然是放在一起的,所以我们应该使用实际的文件夹Folder,点击(Show All Files)按钮即可:可以看到现在显示的就是实际的原创 2020-09-27 17:06:21 · 775 阅读 · 0 评论 -
C++ 学习之旅(4)——调试Debug
调试Debug程序,首先应该确保处于Debug模式而不是Release模式下,因为后者会优化你的程序,也就是对你的程序作出了改变,这样你很难找出问题所在。我们有以下的文件:Log.h#pragma oncevoid Log(const char* message);Math.cpp#include <iostream>#include "Log.h"int main(){ int a = 8; a++; const char* string = "Hello"; f原创 2020-09-27 15:48:14 · 4056 阅读 · 0 评论 -
C++ 学习之旅(3)——头文件Header
我们知道,在C++中,函数只能定义一次,而在cpp文件中如果想使用其他cpp文件中定义了的函数,就必须声明,这样才能通过编译,然后链接器才会在调用函数时找到该函数的定义。那么当函数声明很多的时候,代码就会很臃肿。这时,我们就可以使用.h头文件,通过#include "头文件"的方式,实现函数声明的功能。先说下双引号""和尖括号<>的区别:#include <xxx.h> 系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。#include “xxx.h”用原创 2020-09-27 11:25:23 · 2176 阅读 · 0 评论 -
C++ 学习之旅(2.5)——变量与函数
输出仍然是 ‘A’,这就说明了,指定的数据类型影响到了 cout 的表现,使得它会将变量 a 视作字符,并且打印字符。C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。我们将变量 a 的数据类型指定为 char,并且赋值为 ‘A’,显然输出会得到 ‘A’;,唯一需要注意的是返回值,除了 main 函数之外,所有的函数都需要根据自己的声明返回某种类型的值或者不返回值,而 main 函数默认就会 return 0,最后写不写都可以。.....原创 2022-08-03 17:03:08 · 239 阅读 · 0 评论 -
C++ 学习之旅(2)——链接器Linker
每一个.cpp文件经过编译之后都会生成对应的.obj文件,然后通过链接器把它们进行链接,最后就可以生成.exe可执行文件了。在链接过程中,最常见的错误应该是重复定义了,如下例:Log.hvoid Log(const char* message){ std::cout << message << std::endl;}Log.cpp#include <iostream>#include "Log.h"void InitLog(){ Log("In原创 2020-09-27 10:05:53 · 727 阅读 · 0 评论 -
C++ 学习之旅(1)——编译器Compiler
简单来说,由C++代码文件生成可执行文件的过程如下:#mermaid-svg-PrvRlfwbvN6vbLVm .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-PrvRlfwbvN6vbLVm .label text{fill:#333}#mermaid-svg-PrvRlfwbvN6vbLVm .node r原创 2020-09-26 22:24:54 · 1767 阅读 · 0 评论