
C++面向对象
文章平均质量分 90
Struggle¥
这个作者很懒,什么都没留下…
展开
-
C++学习之路-运算符重载
想要自由的定义运算符的左边是谁,右边是谁,那就需要定义为全局函数。如果该运算符仅仅跟某个类相关,那就优先定义为成员函数。如果实在不可以重载为成员函数,那就全局函数并且设置为友元函数。如果将运算符重载函数设置为private私有,那么外部就不可以实现运算符的重载。比如:ostream类下的cout对象即使返回的不是const类型,也不可以被赋值,就是因为C++内部将ostream的赋值运算符重载为private了。单例模式要求类外只能创建一个对象。即使我创建两个对象,这两个对象也是同一个对象。...原创 2022-08-15 16:25:44 · 1306 阅读 · 0 评论 -
c++学习之路-内部类和局部类
如果类A定义在类B里,那么类A就是一个内部类(也叫嵌套类)class Man // 内部类 {};};原创 2022-08-04 20:29:13 · 1139 阅读 · 0 评论 -
C++学习之路-友元
允许访问类的私有成员的函数,叫作该类的友元函数。friend 返回类型 函数名(参数列表);int m_x;int m_y;public :;} };友元函数必须写在类的大括号里面,至于写在private、public、protected哪个下面,都无所谓。将函数声明为该类的友元函数,也就意味着该函数是该类的朋友,那就可以随意访问该类的私有成员变量了(可以访问所有成员,包括public和protected的)。想要某个函数可以访问类中的私有成员,就设置为友元函数。...原创 2022-08-04 16:32:56 · 446 阅读 · 0 评论 -
C++学习之路-编译器自动生成的构造函数
在该类中,我声明一个空的虚函数。创建对象时,也会调用构造函数。意味着,编译器也会默认的创建一个无参的构造函数public :} };我们通过查看构造函数内部,发现存在这样的一个操作:将虚表地址放在对象内存的最前面,用于查找虚表(细节可以查看我之前的博文)博文中:一旦类中有虚函数,创建对象时,对象最前面会多出四个字节存放虚表地址类中存在虚函数时,即使不写构造函数,编译器也会默认的生成一个无参的构造函数,从而在函数内部完成虚表地址的存放。......原创 2022-08-03 17:37:37 · 1435 阅读 · 1 评论 -
C++学习之路-隐式构造
字面意思可以理解,我在创建对象的时候,本意不是想调用单参数的构造函数,但是由于我代码书写的原因,偷摸的调用了单参数的构造函数。上面那种荒唐的写法虽然没有错,但是会隐式的调用单参数构造函数,这其实是我们不想看到的。用explicit关键字修饰单参数的构造函数,表明这个单参数的构造函数不允许隐式构造,即不允许直接将单个值赋值给对象。构造函数分为无参构造函数,和有参构造函数。注意看这句代码,将一个int型的变量,传递给对象p4,看起来很荒唐。因为,表面上,我们看不出来这句代码在调用构造函数,才叫做隐式构造。...原创 2022-07-27 17:42:31 · 1876 阅读 · 0 评论 -
C++学习之路-对象类型的参数和返回值
尽量不要将对象作为函数的返回值,尽量不要直接将对象作为函数参数传递。返回值尽量不要用,对象作为参数时,要用引用或者指针,而不是直接对象值传递。不要用的目的就是,避免产生一些中间变量(也就是拷贝操作产生的多余变量).........原创 2022-07-27 10:23:50 · 991 阅读 · 3 评论 -
C++学习之路-拷贝构造函数
拷贝构造函数也是构造函数的一种。普通的构造函数可以是无参的,也可以是有参的。但是拷贝构造函数必须是有参的,如下所示,参数就是const类型的对象引用(格式固定,别问为什么)我们知道,当创建对象的时候会自动调用构造函数。那什么时候会调用拷贝构造函数呢?答案是:当利用已存在的对象创建一个新对象时(拷贝对象),就会调用新对象的拷贝构造函数进行初始化新对象的成员变量。拷贝对象,拷贝了什么?利用已经存在的对象去创建新的对象,叫作拷贝操作。拷贝对象,也就是拷贝了对象内存里的东西,也就是拷贝了原有对象的成员。用一原创 2022-07-07 21:14:42 · 6764 阅读 · 3 评论 -
C++学习之路-const成员
被const修饰的成员变量和非静态(static)成员函数,都叫作const成员。const成员变量必须初始化(必须类内部初始化):可以在声明的时候,直接初始化赋值如果不初始化,构造函数会报错:未提供初始值设定项构造函数初始化列表上面两种初始化方式,只能适用于非静态的const成员变量,如果遇到静态的const成员变量,就不能放在初始化列表里初始化了我们知道,static成员变量必须在类外初始化。但是一旦是static+const成员变量,那类内类外都可以初始化了。类内const原创 2022-06-09 18:08:14 · 2197 阅读 · 0 评论 -
C++学习之路-static静态成员的使用
被static关键字修饰的成员变量。即使定义在类内,静态成员变量存储在全局区,相当于全局变量,整个程序的运行过程中只有一份内存。static成员变量的访问方式对象访问指向对象的指针访问用类直接访问时提示:非静态成员引用必须与特定的对象相对指向对象的指针访问用类直接访问时我们可以看到,静态成员变量的访问方式,比非静态成员变量多了一个类访问。我们在类中定义了静态成员变量。必须要在类外对该静态成员变量初始化,否则会报错。(错误 LNK2001 无法解析的外部符号原创 2022-06-08 17:49:36 · 663 阅读 · 1 评论 -
C++学习之路-菱形继承与虚继承
继承的形状类似于菱形,比如爷爷类有一个,父类有2个 子类有一个。如下图所示:即 Undergraduate 继承于Student,Worker。Student,Worker又同时继承于Person。菱形继承的问题我们知道Student 继承于Person,那么就相当于把Person里所有的东西都拿到Student里。Person的成员变量也会存于Student里同理,Worker类也是如此,会将Person类的成员变量存于Worker类。由于,Undergraduate 类多继承于Student类原创 2022-06-03 22:17:07 · 462 阅读 · 0 评论 -
C++学习之路-多继承
多继承,顾名思义就是继承多个父类。以往派生类只有一个基类,叫作单继承。派生类有两个或者两个以上的基类,就叫作多继承。多继承的语法也很简单,将多个基类用逗号隔开。例如已声明了类A、类B和类C,那么可以这样来声明派生类D:可以看到一个细节,可以分别用不同的方式继承基类,比如public, private, protected。但我们学过继承(可以看之前的博文),继承方式尽量只选public。派生类初始化基类中的private成员变量,都需要借助初始化列表的初始化方式,并且调用基类中的构造函数,间接的去初始原创 2022-06-01 21:41:13 · 1169 阅读 · 0 评论 -
C++学习之路-多态
面向对象三大板块之一:多态一、父类指针指向子类对象二、什么是多态三、多态的要素四、多态的本质(虚函数的本质)多张虚表的情况虚表的一些注意事项虚表的意义五、虚析构函数六、多重继承下的虚函数问题七、纯虚函数抽象类(Abstract class)八、多态总结一、父类指针指向子类对象学习多态之前,我们先学一个关键的知识点:父类指针指向子类对象。class Person{public: int m_age; Person() { cout << "Person::Person()"原创 2022-05-22 17:14:25 · 1201 阅读 · 7 评论 -
C++学习之路-构造函数的初始化列表
初始化列表何为初始化列表初始化列表的本质初始化列表的优势初始化列表中列表顺序问题初始化列表与默认参数的配合使用初始化列表的注意之处构造函数的声明和实现分离时,初始化列表需写在实现里子类调用父类的构造函数初始化列表总结何为初始化列表定义:一种便捷的初始化类内成员变量的方式。初始化成员变量通常在构造函数里执行,如下例所示。成员变量的初始化可以通过调用有参的构造函数进行传参初始化,也可以通过调用无参的构造函数在函数体内部直接初始化(可以看我之前的博文)。下例展示了调用有参的构造函数始化成员变量的方式。原创 2022-05-20 11:40:48 · 10401 阅读 · 10 评论 -
C++学习之路—面向对象—继承
C++类的继承、继承规则、多重继承什么叫类的继承特性C++中类的继承特性指的是子类继承父类的成员的一种特性。一旦子类合理的继承了某个父类,就可以直接使用其内部的成员,避免重新添加成员,可减少代码量,增加程序的可读性。继承的写法如下:Parent类是父类,Children是子类。class Parent{};class Children : public Parent{};为什么要有C++的继承特性比如stud原创 2022-02-01 23:16:42 · 576 阅读 · 0 评论 -
C++学习之路—面向对象—析构函数
C++面向对象-析构函数的用法定义析构函数最主要的作用通过malloc分配的对象,在free释放时,不会调用析构函数通过new分配的对象,在delete释放时,会调用析构函数malloc和new的差异总结定义析构函数也叫析构器,在对象销毁时自动调用,一般用于完成对象的清理工作。无返回值,无参,不可以重载,有且只有一个析构函数,不像构造函数可以重载。下方程序中,~Person()函数就是Person类的析构函数,与类重名,只不过前面有一个" ~ "符号class Person{public:原创 2022-01-24 12:44:58 · 670 阅读 · 0 评论 -
C++学习之路—面向对象—构造函数
C++面向对象之构造函数定义构造函数的用途使用构造函数有几点需要注意定义构造函数也叫构造器,在对象创建的时候自动调用,一般用于完成对象的初始化工作下方示例中Person()就是类的构造函数class Person{public: Person();//创建类时自动创建的构造函数,也可以手动添加,这个为构造函数的声明 ~Person();//虚构函数,后续文章会记录 int m_member;private:};Person::Person()//构造函数的实现-无参数构造原创 2022-01-21 21:14:10 · 1277 阅读 · 1 评论 -
C++学习之路—内存空间的布局
C++内存空间的布局简介栈空间代码区全局区堆空间栈空间、全局区都能存放东西,那堆空间存在的价值是什么????申请\释放堆空间1、malooc\free方法2、new\delete方法3、申请\释放需要注意的地方如果把堆空间的申请放在函数里,会随着函数的调用自动回收吗?在函数内部进行堆空间的申请所涉及的内存区域问题堆空间初始化方法1、malloc堆空间初始化方法顺便唠叨一下memset函数的作用2、new堆空间初始化方法类实例出来得对象的内存可以存在3种地方简介C++工程下的内存大致分为四个部分:栈空间、原创 2022-01-15 22:11:15 · 713 阅读 · 2 评论 -
C++学习之路—面向对象—封装
C++面向对象之封装定义封装的目的正好唠叨两句C++与C的区别public、private、protected的区别如何实现自己对private成员用途的一些理解定义在C++工程中,往往会有很多类的存在,为了避免类之间的相互影响。应该让类仅仅public一些必须让外界访问的成员,而隐藏private一些不想要公开的成员内容。这种信息的隐藏,就叫做C++类的封装。封装的目的封装的目的是为了保护私有成员变量正好唠叨两句C++与C的区别C++对C的最根本的改变就是把函数放进了结构之中,也就是我们原创 2022-01-15 11:24:01 · 470 阅读 · 0 评论 -
C++学习之路—面向对象—指针访问的本质
面向对象-指针访问的本质一道题,彻底了解指针间接访问所指向对象的成员变量的本质如何利用指针间接访问所指向对象的成员变量呢?解题一道题,彻底了解指针间接访问所指向对象的成员变量的本质首先定义一个类class Person{public: int m_id; int m_age; int m_height; void display() { cout << "m_id=" << m_id << endl; cout << "m_age原创 2022-01-13 18:25:38 · 362 阅读 · 0 评论 -
C++学习之路—面向对象—类
C++面向对象-类class和struct的联系与区别类创建多个对象时需要注意的地方1、不同对象调用同一个成员变量问题2、不同对象调用同一个成员函数3、this的作用:C++内存布局问题总结补充小tipsclass和struct的联系与区别在C语言中,没有class,只有struct。C语言中的struct叫作结构体,不叫作‘类’在C语言中,struct里只可以有结构体变量,对比类中就是成员变量在C++中,struct和class都是可以定义类的,且struct里既可以有成员变量,也可以有成员函数原创 2022-01-13 16:58:19 · 589 阅读 · 0 评论