引言上一节中我们举了这样一个例子: 123456789101112131415161718#include <iostream>class MyClass{public: int _a; char _b; int add(){ return (_a+_b); }};int main(){ MyClass m,n; m._a=1; m._b=2; n._a=3; n._b=4; std::cout<<m.add(); return 0;} 我们是一个一个地将对象的成员进行初始化的 。这样不仅麻烦 ,而且使代码显得太长。 或许我们可以在类中定义一个初始化的函数 : 12345678910class ClassName{public: void init(int a,char b){ _a=a; _b=b; }private: int _a; cha ...
引言本节我们将学习C++中类的存储模型,据此更好地讲解this指针及其作用。由于C++的类和C语言中的结构体大致相当,所以我们先回顾C中结构体的存储方式,即字节对齐 。 先看个例子学习C语言时,我们可能了解过结构体的字节对齐 。数据结构老师讲的合理吗……它是结构体的成员进行存储时采用的方式。比如,对于下面这样一个结构体: 1234567typedef struct MyStruct{ int a; char b; int c; short int d; char e;}MyStruct; 可否想过,如果我们对其进行取大小运算,即sizeof(MyStruct),结果将会是多少? 我们可能会直接将各个成员的大小加起来,所以结果将会是4+1+4+2+1=12 。我们不妨去程序里面验证一下: 结果和我们之前计算的竟然不一样!我不演了,这个问题就出在结构体的字节对齐 。 字节对齐的含义字节对齐可以表述为:各种类型的数据按照一定的规则在空间上排列,而不是按顺序一个接一个地排放。 就上面的例子而言,结构体的中每四个字节分一段,所以储存的结果为: ...
C++是一门面向对象的语言。C++刚出现的时候,被称为”C with Classes”,可见类之于C++的重要性。在本章我们将关注C++的类及其用法。 引言:C语言的结构体C语言中,我们学习了结构体。使用结构体可以把不同类型的变量组合在一起。 123456struct MyStruct{ int a; char b; float c;};struct MyStruct mystruct; 使用结构体,要分清下面几个概念: 结构体名 :MyStruct是结构体的名字。 结构体类型 :struct Mystruct是一个结构体类型 结构体变量 :struct MyStruct类型的变量mystruct是一个结构体变量。 为了避免每次定义结构体变量的时候都要写 struct MyStruct ,我们常常采用 typedef 的方式将结构体名升级为类型名: 123456typedef struct MyStruct{ int a; char b; float c;}MyStruct;MyStruct myst ...
引言本节涉及到预处理和编译的相关知识,我们先来回顾一下C/C++程序执行的过程(以g++编译器为例)。 预处理 的指令为cpp main.cpp > main.i。 它主要进行的是头文件的展开与宏的替换。预处理后得到的文件为main.i。 编译 的指令为g++ -S main.i。 编译后得到的文件为main.s。 汇编 的指令为as -o main.o main.s。 汇编得到的文件为main.o。.o文件时我们经常见到的中间文件(直接用IDE应该很少见到)。 链接 的指令为g++ -o main main.o。 Windows平台下生成的文件就是我们经常看到的.exe (可执行文件)。 如果读者还有疑惑或不熟悉,请移步这篇教程: C/C++的执行过程https://www.fullcomb.top/post/fb935c76.html 宏(Macro)宏的使用 定义一个符号常量。这是我们经常使用的宏定义的形式,如#define PI 3.14 。它的好处是便于代码的维护。 宏函数替换常用的语句。如#define MAX(x,y) ((x)>(y)?(x): ...
引言在我们学习C语言的指针 的时候大多数教材都会讲到“交换a和b两个数 ”的例子: 123456789101112#include <stdio.h>void swap(int a,int b){ int temp=a; a=b; b=temp;}int main(){ int a=1,b=2; swap(a,b); printf("%d,%d",a,b); return 0;} 由于实参的保护机制,这样的交换是不成功的。要达到交换的目的,C语言告诉我们应该使用指针: 实参的保护机制是C语言的内容,但是为了保证这个C++系列 知识点的完备性,我尽可能地穿插讲解一些C语言的知识点。 知识点补充:实参的保护机制 TODO,涉及到汇编内容比较多,我也不怎么熟悉还得捋捋,但是又得尽可能讲简单点……还没想好怎么写比较好……看来都还给老师了…… 123456789 ...
引言实例一读者也许使用过一些图形库进行图形绘制或游戏制作,如 自己先想想再把鼠标移过来。使用这些库的时候,我们直接调用里面的函数(API)即可实现想要的功能。 API : Application Programming Interface,应用程序编程接口 而在调用这些API时,经常会遇到这样的情况:要使用的函数形参有很多。但是,我们往往只需要设置其中的某些参数,或者不知道其他参数设置了有什么用。这时就更希望那些我们没有自定义的参数使用比较合理的默认值。这样就不必输入全部的参数,使用起来也更加简便。 要实现这点,在C++中,就要用到省略参数。 实例二若要求我们实现一个加法器的程序,使它既能进行int相加,也能进行double相加和float相加。C语言中,我们的做法是分别定义下列的加法函数,然后针对不同类型的数据分别调用。 123int add_int(int a,int b); double add_double(double a,double b);float add_float(float a,float b); 有没有办法可以只用一个函数add(),既能实现int相加,也能 ...
引言学习一门语言,一般都是从Hello,world!开始的。我们先来看一下C++的Hello,world!。 123456#include <iostream>using namespace std;int main(){ cout<<"Hello,world!"<<endl; return 0;} 这时初学者一般会有两个疑惑: namespace是什么鬼? cout和endl又是什么? 为什么头文件没有.h? 这三个问题将在本节解决。 命名空间情景在使用C语言进行协同项目开发时,可能会有这样的情况:A和B在编写各自的模块时,都定义了相同名字的函数。他们各自的代码能够编译通过,但是最后合并的时候,编译器却会报错。这个问题就是重定义。 如下图,A和B都定义了一个名叫foo的函数。我们分别编译A和B的代码,是没有问题的。但是,最后链接的时候,编译器报错”ambiguating new declaration“(重定义)。 如果对C的编译和链接有疑惑,可以去简单看看这篇文章: 编译与链接https ...
avatar
Sato
我们的前方究竟会通往何处?
Follow Me In Github
公告

莱莎的炼金工房

十年炼金无人问,一朝肉腿天下知。

住在村裡的萊莎有如鄰家女孩,是一位“再普通不過”的少女。
某日,萊莎一行下定決心,前往禁止進入的「浮島對岸」,展開首次探險活動。
于是,僅限今夏的冒險,从此开始。