【C++】运算符重载
(一)不可重载的运算符 (二)运算符重载语法 函数名:类型 operator运算符(){} (三)重载++123456789101112131415161718192021222324252627282930313233343536373839#include <iostream>using namespace std;class Int{ int val;public: Int() :val(0) {} Int(int value) { val = value; } //缺省拷贝构造 Int(const Int& src):val(src.val){} //缺省的赋值运算符重载 Int& operator=(const Int& src) { if(this != &src) { val = src.val; return *this; } } //前置++ Int& operator ...
【C++】数组的引用
引用数组:就是对数组进行引用 1234567891011#include <iostream>using namespace std;int main(){ int arr[5] = {1, 2, 3, 4, 5}; int (&b)[5] = arr; //b就是arr数组的引用 return 0;} 通过b来打印arr中的元素: 12345678void Print(int(&b)[5]){ for (int i = 0; i < 5; ++i) { cout << b[i] << " "; } cout << endl;} 完整: 123456789101112131415161718#include <iostream>using namespace std;void Print(int(&b)[5]){ for (int i = 0; i < 5; ++i) { ...
【C++】拷贝构造函数
(一)拷贝构造函数同一个类的对象在内存中拥有相同的结构,若作为整体拷贝是可以的。但我们知道,同一个类的方法是所有该类的对象共用的。所以只需要拷贝数据成员。拷贝构造函数的功能就是专门拷贝数据成员的函数。 拷贝构造函数的作用:当使用一个成员对象初始化一个对象时,会调用该函数来构造对象 (二)浅拷贝的问题- 当析构使用缺省的拷贝构造函数(浅拷贝)构造的对象和被拷贝的对象时(有堆区空间),在两次delete时,由于是浅拷贝,所以两次delete的空间地址是同一块内存地址,程序会崩溃。(三)解决方案(1)深拷贝的拷贝构造函数1234567891011121314151617181920class Object{public: //深拷贝拷贝构造函数 Object(const Object& src):name(new char[strlen(src.name) + 1]) { //深拷贝 strcpy(name, src.name); } //对应的析构函数 ~object() { if(name != NULL) { de ...
【C++】引用实现双向函数
(一)题目描述如何使用一个函数实现SetValue和GetValue的功能? 1234567891011121314151617#include <iostream>using namespace std;class Obj{public: Obj():value(0) {} void SetValue(int val) { value = val; } int GetValue() { return value; }private: int value;};(二)引用实现123456789101112131415161718192021222324252627282930313233343536373839#include <iostream>using namespace std;class Obj{public: Obj():value(0) {} Obj(int val) { value = val; } void Se ...
【C++】引用本质
(一)汇编层面看引用1234567891011#include <iostream>using namespace std;int main(){ int a = 10; int* p = &a; int& q = a; return 0;} 汇编代码:可以看出,引用底层就是指针实现的 (二)程序分析我们再通过一个程序进行分析:1234567891011121314151617181920#include <iostream>using namespace std;void fun(int& a){ int* p = &a; a = 20; *p = 100;}int main(){ int x = 10; int& y = x; //y是x的别名 fun(x); //调用fun(),a是x的别名,p指向a的地址,a = 20(x = 20),*p = 100(x = 100),所以x = 100; cout << "x =" &l ...
【C++】__cplusplus宏
这篇文章将讲述__cplusplus这个宏的用法。这个宏经常和预处理指令搭配使用。 下面描述一个场景:同一份代码,既可以让C编译器编译并且C++编译器也可编译通过。如何实现呢? (1)实现手段:__cplusplus#ifdef __cpluscplus...//C++代码#else...//C代码#endif (2)测试代码123456789101112int main(){ int a = 10; int b = 20;#ifdef __cplusplus cout << a << " " << b << endl;#else printf("a = %d, b = %d\n", a, b);#endif return 0;} (3)C编译器 (4)C++编译器
【C++】new/delete对象过程
引言:我们往往使用new delete对象,这个过程被编译器藏得很深,但是这个过程具体是什么?和C语言的malloc、free有什么样的区别和联系呢?那就先看看下面这个点类的设计,本文将通过这个代码进行new和delete对象的步骤的深入。 12345678910111213141516171819202122232425#include <iostream>using namespace std;class Point{public: Point(){} Point(int r, int c) { row = r; col = c; } ~Point();private: int row; //行 int col; //列};int main(){ //new p过程 Point* p = new Point(10, 20); //delete p过程 delete p;} (一)new对象过程123456789//new p过程Point* p = new Point(10, 20) ...
【C++】构造-析构详解
(一)构造函数的用途 创建对象 初始化对象的属性 类型转换(只允许单个参数的构造函数) explicit加在构造函数前表示明确不允许隐式类型转换。 1234567891011121314151617#include <iostream>using namespace std;class Object{public: //explicit禁止隐式类型转换 explicit Object(int x = 0):val(x){}private: int val;};int main(){ Object obja; obja = 10; //err obja = (Object)10; return 0;} (二)构造函数的特点 构造函数是特有公有成员函数;(1%特殊情况:可以私有、保护) 构造函数无返回值类型(实际上返回创建的对象) 程序运行,构造对象时,该对象所属类的构造函数自动被调用 构造函数可以重载 构造函数可以在类中定义,类中声明,在类外定义 若没有给定构造函数,C++编译器添加缺省的构造函数 类名(vo ...
【C++】常方法+常对象
引言 前一节类的编译流程中简单介绍了this指针的类型,但没说为什么是这种定义方式。this指针的原型就是类名* const this,其实也就是为什么*的右边需要加个const,原因很简单:害怕程序员修改this指针的值,比如说:置空this = NULL; 这种操作对代码的后续执行是致命的。 (一)this指针+const看了引言的小伙伴就很疑惑,明明都已经说过了this加const的情况,那为何还有const可加?? 这是之前讲过的栗子: 123int a = 10;int* const p = &a;const int* const cp = &a; 可以看到上面的p就相当于对象中的那个this指针的类型(依赖于对象),而cp就是我所谓的this指针+const了。很明显,并不重复。 C++中也为this指针提供了这种定义方式:(常方法) 返回值 方法名(形参列表)const; ()后面的const修饰的就是对应方法的第一个参数this指针,形式如下:const 类名* const this,这里的左const就是我们在()后面加的const,右const ...
【C++】类的编译流程
C++编译器对类的编译流程 (1)找到成员属性(类型,成员名)(2)识别方法声明(识别函数原型)(3)改写方法:在每个方法的第一个形参前面添加个 该类的一个this指针(类名* const this) 例如:123456789101112#include <iostream>using namespace std;class Person{public: Person(); //构造 ~Person(); //析构 Person(char* _name, int _age); //有参构造private: int age; //年龄 char* name; //姓名};改写前: 123456789101112131415161718192021//实现Person::Person():age(0), name(new char[20]){} Person::Person(char* _name, int _age):name(new char[20]){ if(_name == NU ...