- 博客(80)
- 收藏
- 关注
原创 继承中构造和析构顺序
1.子类继承父类后,当创建子类对象,也会调用父类的构造函数2.继承中先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反#include<iostream>using namespace std;#include<string>//继承中的构造和析构顺序class Base{public: Base() { cout << "Base构造函数" << endl; } ~Base() { cout <<
2021-02-27 17:40:10 730
原创 继承中的对象模型
1.父类中私有成员也是被子类继承下去了,只是由编译器给隐藏后访问不到#include<iostream>using namespace std;#include<string>//继承方式//父类中私有成员也是被子类继承下去了,只是由编译器给隐藏后访问不到class Base{public: int m_a;protected: int m_b;private: int m_c;};class Son :public Base{public:
2021-02-27 17:14:23 95
原创 类的继承方式
1.继承语法: class 子类 : 继承方式 父类2.继承方式一共三种:公共继承 保护继承 私有继承#include<iostream>using namespace std;#include<string>//继承方式class Base1{public: int m_a;protected: int m_b;private: int m_c;};//公共继承class Son1 :public Base1{public:
2021-02-27 15:59:54 666
原创 继承的基本用法
1.继承的好处:可以减少重复的代码2.语法: class A : public BA为子类或者派生类 B为父类或基类3.派生类中的成员包含两大部分:一类是从基类继承过来的,一类是自己增加的成员 从基类继承过来的表现其共性,而新增的成员体现其个性#include<iostream>using namespace std;#include<string>//普通实现页面//Java页面//class Java//{//public:// ///
2021-02-27 15:01:50 321
原创 关系运算符重载
1.作用:重载关系运算符,可以让两个自定义类型对象进行对比操作#include<iostream>using namespace std;#include<string>//重载关系运算符class Person{public: Person(string name,int age) { m_name = name; m_age = age; } //重载==号 bool operator==(Person &p) { if (
2021-02-27 12:44:02 674
原创 赋值运算符重载
c++编译器至少给一个类添加4个函数:默认构造函数(无参,函数体为空) 默认析构函数(无参,函数体为空) 默认拷贝构造函数,对属性进行值拷贝 赋值运算符operator=,对属性进行值拷贝如果类中有属性指向堆区,做赋值操作时也会出现深浅拷贝问题;#include<iostream>using namespace std;#include<string>//赋值运算符重载class Person{public: Person(int age) {
2021-02-25 17:16:24 156
原创 递增运算符重载
1.作用:通过重载递增运算符,实现自己的整型数据2.前置递增返回引用,后置递增返回值#include<iostream>using namespace std;#include<string>//重载递增运算符//自定义整型class MyInteger{ friend ostream &operator<<(ostream &cout, MyInteger myint);public: MyInteger() { m_
2021-02-25 14:32:08 270 2
原创 左移运算符重载
1.作用:可以输出自定义数据类型,比如输出一个类对象。#include<iostream>using namespace std;#include<string>//左移<<运算符重载class Person{ friend ostream &operator<<(ostream &cout, Person &p);public: Person(int a, int b) :m_a(a), m_b(b) { }
2021-02-25 12:33:19 234 1
原创 加号运算符重载
1.运算符重载:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型2.加号运算符重载:实现两个自定义数据类型相加的运算#include<iostream>using namespace std;#include<string>//加号运算符重载class Person{public: //1.成员函数重载+号 /*Person operator+(Person &p) { Person temp; temp.m_a =
2021-02-25 11:17:55 467
原创 成员函数做友元
#include<iostream>using namespace std;#include<string>//类做友元class Home;class Goodfriend{public: Goodfriend(); Home *home; void visit();//让visit函数可以访问home的私有成员 void visit2();//让visit2函数不可以访问home的私有成员};class Home{ //告诉编译器,Goodf.
2021-02-25 10:46:20 270
原创 类做友元
1.类做友元#include<iostream>using namespace std;#include<string>//类做友元class Home;class Goodfriend{public: Goodfriend(); Home *home; void vist();//参观函数,访问home的属性};class Home{ //Goodfriend类是本类的好朋友,可以访问本类中私有成员 friend class Goodfri
2021-02-25 10:32:08 144
原创 全局函数做友元
1.目的:让一个函数或者类访问另一个类中的私有成员2.关键字:friend3.友元的三种实现:全局函数做友元 类做友元 成员函数做友元#include<iostream>using namespace std;#include<string>class Home{ // goodfriend全局函数是Home的好朋友,可以访问Home中的私有成员 friend void goodfriend(Home *home);public: Home()
2021-02-24 17:23:10 237
原创 const修饰成员函数
常函数:成员函数后加const后我们称这个函数为常函数 常函数内不可以修改成员属性 成员属性声明时加关键字mutable后,在常函数中依然可以修改常对象:声明对象前加const称为该对象为常对象 常对象只能调用常函数#include<iostream>using namespace std;//常函数class Person{public: //this指针的本质,是指针常量,指针的指向是不可以修改的 //在成员函数后面加const,修饰的是this指向,让指
2021-02-24 16:46:39 113
原创 空指针访问成员函数
1.c++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针2.如果用到this指针,需要加以判断保证代码的健壮性#include<iostream>using namespace std;//空指针调用成员函数class Person{public: void showclassname() { cout << "this is Person class" << endl; } void showPersonage()
2021-02-24 16:20:28 82
原创 this指针
1.this指针指向被调用的成员函数所属的对象2.this指针是隐含在每一个非静态成员函数内的一种指针3.this指针不需要定义,直接使用即可4.this指针的用途当形参和成员变量同名时,可用this指针来区分 在类的非静态成员函数中返回对象本身,可使用 return *this#include<iostream>using namespace std;class Person{public: Person(int age) { //this指针指向被调
2021-02-24 14:23:11 67
原创 成员变量和成员函数分开存储
1.在c++中类内的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上#include<iostream>using namespace std;#include<string>//成员变量和成员函数分开存储//空对象占用空间为1字节//c++编译器会给每个空间对象也分配一个字节空间,是为了区分空对象占内存的位置//每个空对象也应该有一个独一无二的内存地址class Person{ int m_a;//非静态成员变量 属于类的对象上 stati
2021-02-23 18:24:34 116
原创 静态成员
1.静态成员:在成员变量和成员函数前加上关键字static2.静态成员分为:静态成员变量所有对象共享同一份数据 在编译阶段分配内存 类内声明,类外初始化静态成员函数所有对象共享同一个函数 静态成员函数只能访问静态成员变量#include<iostream>using namespace std;#include<string>//静态成员函数//所有对象共享同一个函数//静态成员函数只能访问静态成员变量class Person{public:
2021-02-23 17:41:10 64
原创 类对象作为类成员
1.解释:c++类中的成员可以是另一个类的对象,我们称该成员为对象成员2.当其他类对象作为本类的成员的时候:构造的时候先构造类对象,再构造自身,析构的顺序相反。#include<iostream>using namespace std;#include<string>//类对象作为类成员class Phone{public: Phone(string pname) { cout << "Phone的构造函数调用" << e.
2021-02-23 16:54:30 365
原创 初始化列表
1.作用:c++提供了初始化列表语法,用来初始化属性2.语法:构造函数():属性1(值1),属性2(值2)...{ }#include<iostream>using namespace std;//初始化列表class Person{public: /*传统初始化操作 Person(int a, int b, int c) { m_a = a; m_b = b; m_c = c; }*/ //初始化列表初始化属性 //方法一: //Person()
2021-02-23 16:03:57 105
原创 深拷贝和浅拷贝
1.深拷贝:在堆区重新申请空间,进行拷贝操作2.浅拷贝:简单的赋值拷贝操作,其带来的问题就是堆区的内存重复释放,要利用深拷贝来解决。3.如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题#include<iostream>using namespace std;//深拷贝和浅拷贝class Person{public: Person() { cout << "Person的默认构造函数调用" << endl; }
2021-02-23 15:26:01 170 1
原创 构造函数调用规则
1.默认情况下,c++编译器至少给一个类添加3个函数默认构造函数(无参,函数体为空) 默认析构函数(无参,函数体为空) 默认拷贝构造函数,对属性进行值拷贝2.构造函数调用规则如下:如果用户定义有参构造函数,c++不再提供默认无参构造,但是会提供默认拷贝构造 如果用户定义拷贝构造函数,c++不会再提供其他构造函数...
2021-02-23 14:51:59 1299
原创 拷贝构造函数调用时机
1.c++中拷贝构造函数调用时机通常有三种情况使用一个已经创建完毕的对象来初始化一个新对象 值传递的方式给函数参数传值 以值方式返回局部对象#include<iostream>using namespace std;class Person{public: //构造函数 Person() { cout << "Person的无参构造函数的调用" << endl; } Person(int age) { m_age = age;
2021-02-22 17:10:05 144
原创 构造函数的分类及调用
1.两种分类方式:按参数分为:有参构造和无参构造 按类型分为:普通构造和拷贝构造2.三种调用方式:括号法 显示法 隐式转换法#include<iostream>using namespace std;//1.构造函数的分类和调用//分类// 按照参数分类 无参构造(默认构造)和有参构造// 按照类型分类 普通构造和拷贝构造class Person{public: //构造函数 Person() { cout << "Person
2021-02-22 16:03:19 181
原创 构造函数和析构函数
1.构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用。2.析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作3.构造函数语法: 类名(){ }构造函数没有返回值也不写void 函数名称与类名相同 构造函数有参数,因此可以发生重载 程序在调用对象时候会自动调用构造,无需手动调用,而且只会调用一次4.析构函数语法: ~类名(){ }析构函数没有返回值也不写void 函数名称与类名相同,在名称前加上符号~ 析构函数不可以有参数..
2021-02-22 15:23:48 156
原创 类和对象-封装-设计案例-点和圆的关系
1.实现一#include<iostream>using namespace std;//判断点和圆的关系class Point{public: void setx(int x) { m_x = x; } int getx() { return m_x; } void sety(int y) { m_y = y; } int gety() { return m_y; }private: int m_x; int m_y;};
2021-02-22 14:51:19 267
原创 类和对象-封装-设计案例-立方体类
#include<iostream>#include<string>using namespace std;//class代表一个类,后面紧跟类名class Cube{public: void setm_l(int l) { m_l = l; } int getm_l() { return m_l; } void setm_w(int w) { m_w = w; } int getm_w() { return m_w; }.
2021-02-21 19:23:02 142
原创 类和对象-封装-成员属性私有化
1.优点:将所有成员权限设置为私有,可以自己控制读写权限 对于写权限,我们可以检测数据的有效性#include<iostream>#include<string>using namespace std;//class代表一个类,后面紧跟类名class Person{public: //设置姓名 可写 void setname(string name) { m_name = name; } //获取姓名 可读 string getname()
2021-02-21 17:46:09 121
原创 类和对象-封装-c++中class和struct的区别
1.区别:默认的访问权限不同struct 默认权限为公共 class 默认权限为私有#include<iostream>using namespace std;//class代表一个类,后面紧跟类名class C1{ int m_a;//默认权限为私有private};struct C2{ int m_a;//默认权限为公共public};int main(){ C1 c1; C2 c2; //c1.m_a = 10; 因为c1类的成员m_a为私有,
2021-02-21 17:19:26 125 1
原创 类和对象-封装-访问权限
1.访问权限public 公共权限 类内类外都可以访问 protected 保护权限 类内可以访问,类外不可以访问,儿子可以访问父亲中的保护内容 private 私有权限 类内可以访问,类外不可以访问,儿子不可以访问父亲的私有内容#include<iostream>using namespace std;//class代表一个类,后面紧跟类名class Person{ //公共权限public: string m_na...
2021-02-21 14:57:44 81
原创 类和对象-封装-封装的意义
1.封装的意义将属性和行为作为一个整体,表现生活中的事务;类中的属性和行为我们统称为成员 将属性和行为加以权限控制 语法:class 类名{ 访问权限:属性 / 行为 }; //(具有相同性质的对象,我们可以抽象为类)#include<iostream>using namespace std;const double PI = 3.14;//设计一个园类,求其周长//class代表一个类,后面紧跟类名class Circle{ //访问权限。这里仅包含公共权限pu
2021-02-21 14:41:52 358
原创 函数重载注意事项
1.引用作为重载条件2.函数重载碰到函数默认参数#include<iostream>using namespace std;//引用作为重载条件void func(int &a) //int &a=10;不合法{ cout << "func(int &a)调用" << endl;}void func(const int &a) //const int &a=10;合法{ cout <<
2021-02-21 14:13:57 115
原创 函数重载概述
1.作用: 函数名可以相同,提高复用性2.函数重载满足条件同一个作用域下 函数名称相同 函数参数类型不同或者个数不同或者顺序不同 注意:函数的返回值不可以作为函数重载的条件#include<iostream>using namespace std;//1.同一个作用域下,在这里是全局作用域//2.函数名称相同//3.函数参数类型不同,或者个数不同,或者顺序不同//函数的返回值不可以作为函数重载的条件,即不可以 int func(double a, int b)v
2021-02-20 18:44:37 263
原创 函数占位参数
1.C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置2.语法: 返回值类型 函数名(数据类型){ }#include<iostream>using namespace std;//函数占位参数,占位参数也可以有默认参数 //占位参数还可以有默认参数 比如void func(int a, int )void func(int a, int ){ cout << "this is func" << endl;}i.
2021-02-20 18:04:53 1107
原创 函数默认参数
1.语法: 返回值类型 函数名 (参数=默认值) { }#include<iostream>//#include<stdlib.h>using namespace std;//如果我们自己传入了数据,就用自己的数据,如果没有,那么用默认值//如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都有默认值int func(int a, int b = 10, int c = 10){ return a + b + c;}//如果函数声明有默认值..
2021-02-20 16:22:20 156
原创 常量引用
1.作用:常量引用主要用来修饰形参,防止误操作2.在函数形参列表中,可以加 const 修饰形参,防止形参改变实参#include<iostream>using namespace std;//使用场景 用来修饰形参,防止误操作 void showvalue(const int &val){ cout<<"val="<<val<<endl; } int main(){/* int &ref=10; 引用本身需
2021-02-19 13:21:29 368
原创 引用的本质
1.本质:引用的本质在C++内部实现是一个指针常量#include<iostream>using namespace std;//发现是引用,转换为 int *const ref = &a;void func(int &ref){ ref=100; //ref是引用,转换为*ref = 100;(此时默认 ref 前面隐藏了" *') } int main(){ int a=10; //自动转换为 int *const ref = &a.
2021-02-19 13:05:54 77
原创 引用做函数参数
1.作用:函数传参时,可以利用引用的技术让形参修饰实参2.优点:可以简化指针修改实参#include<iostream>using namespace std;//值传递void myswap1(int a,int b){ int temp=a; a=b; b=temp; cout<<"a="<<a<<endl; //20 cout<<"b="<<b<<endl; //10 }
2021-02-18 18:16:47 332
原创 引用
1.作用:给变量起别名2.语法:数据类型 &别名 = 原名3.引用必须初始化,引用在初始化后,不可以改变#include<iostream>using namespace std;int main(){ int a=10; int &b=a; cout<<"a="<<a<<endl; //10 cout<<"b="<<b<<endl; //10 b=100; co.
2021-02-18 17:54:38 105 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人