前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C++ 面向对象 一

C++ 面向对象 一

原创
作者头像
mySoul
发布于 2018-10-19 21:54:47
发布于 2018-10-19 21:54:47
4440
举报
文章被收录于专栏:mySoulmySoul

C++ 面向对象

c++创建对象的时候如果使用new运算符,将会返回返回一个指针,指向堆中的内存地址

类,对象

类定义

定义一个类,用来描述一个盒子

代码语言:txt
AI代码解释
复制
#include <iostream>

using namespace std;

class Box {
	public: double length;	// 定义长度
			double breadth;	// 定义宽度
			double height;	// 定义高度
};

int main(){
	return 0;
}

public 表明这是一个公共的成员。class定义一个类

定义对象

代码语言:txt
AI代码解释
复制
#include <iostream>

using namespace std;

class Box {
	public: double length;	// 定义长度
			double breadth;	// 定义宽度
			double height;	// 定义高度
};

int main(){
	Box box1;	// 声明一个对象
	Box box2; // 声明一个对象

	return 0;
}
代码语言:txt
AI代码解释
复制
#include <iostream>

using namespace std;

class Box {
	public: double length;	// 定义长度
			double breadth;	// 定义宽度
			double height;	// 定义高度
};

int main(){
	Box box1;	// 声明一个对象
	Box box2; // 声明一个对象
	double volume = 0.0;	// 定义一个储存体积的

	// 第一个盒子
	box1.length = 5.0;
	box1.breadth = 7.0;	
	box1.height = 5.0;

	// 第二个盒子
	box2.length = 10.0;
	box2.breadth = 10.0;
	box2.height = 10.0;

	// 第一个盒子的体积
	volume = box1.length * box1.breadth * box1.height;
	cout << "第一个盒子的体积" << volume << endl;

	// 第二个盒子的体积
	volume = box2.length * box2.breadth * box2.height;
	cout << "第二个盒子的体积" << volume << endl;

	return 0;
}

类和函数成员

类可以为函数成员。

代码语言:txt
AI代码解释
复制
#include <iostream>

using namespace std;

int getVolume(void){
	return 3;
}

class Box {
	public: double length;	// 定义长度
			double breadth;	// 定义宽度
			double height;	// 定义高度
			double getVolume(void);	// 调用函数,将会返回体积。
};

int main(){
	
	return 0;
}
代码语言:txt
AI代码解释
复制
#include <iostream>

using namespace std;

class Box {
	public: double length;	// 定义长度
			double breadth;	// 定义宽度
			double height;	// 定义高度
			double getVolume(void){
				return length * breadth * height;
			}
};

int main(){
	
	return 0;
}

范围解析运算符

访问解析运算符为:: 说明函数属于哪个类

范围解析运算符指明函数属于哪个类,标明作用域。

代码语言:txt
AI代码解释
复制
#include <iostream>

using namespace std;

int year;	// 定义一个全局变量

class Box {
	public: double length;	// 定义长度
			double breadth;	// 定义宽度
			double height;	// 定义高度
			double getVolume(void){
				return length * breadth * height;
			}
};

void setYear(int year){
	::year = year;	// 指向全局变量
}

int main(){
	
	return 0;
}

在类的外部标明类的成员

代码语言:txt
AI代码解释
复制
#include <iostream>

using namespace std;

int year;	// 定义一个全局变量

class Box {
	public: double length;	// 定义长度
			double breadth;	// 定义宽度
			double height;	// 定义高度
			double getVolume(void){
				return length * breadth * height;
			}
};

void setYear(int year){
	::year = year;	// 指向全局变量
}

double Box::getLength(void){
	return length;	// 此处返回的是Box类下的getLength变量
}

int main(){
	
	return 0;
}

关于inline

解决小函数频繁入栈,出栈的问题,引入inline关键字。

即,内联函数。

使用内联函数的时候,编译器会进行自动替换,即类似于C语言中的宏。以减少入栈和出栈的操作。

这是建议,是否取决于编译器

使用inline的时候,建议在h文件中,需要的时候写inline

https://openhome.cc/Gossip/CppGossip/inlineFunction.html

关于虚函数

虚函数,用来实现多重继承和多态。

这个后期在说

类访问修饰符

数据的封装为面向对象的特点。

防止函数直接访问类的内部成员。

作用域为一个大花括号

public成员

public在外部可以访问

代码语言:txt
AI代码解释
复制
#include <iostream>

using namespace std;

class Line{
public:
	double length;
	void setLength(double len);	// 设置length
	double getLength(void);	// 获取length
}

// 对成员函数进行定义
double Line::getLength(void){
	return length;
}

void Line::setLength(double len){
	length = len;
}

// 主函数
int main(){
	Line line;

	// 设置长度
	line.setLength(6.0);
	cout << line.getLength() << endl;

	// 设置长度
	line.length = 10.0;
	cout << line.length << endl;

	return 0;
}

private 成员

即私有成员,在外部无法访问

缺省值为private 私有的

protected 保护成员

和私有成员类似,最大的不同在于在子类中仍然可以访问。

构造函数 析构函数

构造函数

创建对象的时候会执行构造函数

代码语言:txt
AI代码解释
复制
#include <iostream>

using namespace std;

class Line{
public:
	void setLength(double len);
	double getLength(void);
	Line();	// 构造函数

private:	// 私有
	double length;
};

// 成员函数定义
Line::Line(void)
{
    cout << "Object is being created" << endl;
}

void Line::setLength(double len){
	length = len;
}

double Line::getLength(void){
	return length;
}

// 程序主函数
int main(){
	Line line;

	// 设置长度
	line.setLength(6.0);
	cout << line.getLength() << endl;

	return 0;
}

析构函数

类的特殊成员函数,每次删除创建的对象将会执行析构函数

java中是直接将指向设置为null,即可自动进行清除

代码语言:txt
AI代码解释
复制
#include <iostream>

using namespace std;

class Line{
public:
	void setLength(double len);
	double getLength(void);
	Line();	// 构造函数
	~Line();	// 析构函数

private:	// 私有
	double length;
};

// 成员函数定义
Line::Line(void)
{
    cout << "Object is being created" << endl;
}

Line::~Line(){
	cout << "Object is being deleted" << endl;
}

void Line::setLength(double len){
	length = len;
}

double Line::getLength(void){
	return length;
}

// 程序主函数
int main(){
	Line* line = new Line();

	// 设置长度
	line->setLength(6.0);
	cout << line->getLength() << endl;

	delete line;

	return 0;
}

构造函数初始化列表

代码语言:txt
AI代码解释
复制
#include <iostream>

using namespace std;

class Line{
public:
	void setLength(double len);
	double getLength(void);
	Line();	// 构造函数
	~Line();	// 析构函数

private:	// 私有
	double length;
};

// 成员函数定义
Line::Line(void):length(3)	// 等价于内部定义 length = 3
{
    cout << "Object is being created" << endl;
}

Line::~Line(){
	cout << "Object is being deleted" << endl;
}

void Line::setLength(double len){
	length = len;
}

double Line::getLength(void){
	return length;
}

// 程序主函数
int main(){
	Line* line = new Line();

	// 设置长度
	line->setLength(6.0);
	cout << line->getLength() << endl;

	delete line;

	return 0;
}

需要注意的是,声明的时候是按照声明的顺序进行初始化的,而不是根据初始化列表进行初始化的

拷贝构造函数

一种特殊的构造函数。

这里会涉及到深拷贝和浅拷贝的问题,深拷贝开辟空间,浅拷贝进行引用

使用的场景

把对象传入函数

将对象返回函数

深拷贝,浅拷贝,即使用同类型的对象初始化一个新的对象

类中有指针变量,动态内存分配的时候,必须设置一个拷贝构造函数,如果没有编译器会自动生成拷贝构造函数

代码语言:txt
AI代码解释
复制
#include <iostream>

using namespace std;

class Line{
public:
	int getLength(void);
	void setLength(int length);
	Line(int len);
	Line(const Line &obj);	// 拷贝构造函数 传入的是地址
	~Line();

private:
	int* ptr;	// 定义一个空指针
};

// 设置成员函数,以及构造函数
Line::Line(int len){
	cout << "调用构造函数" << endl;
	// 进行内存分配
	ptr = new int;	// 在堆中创建内存空间,完成指向
	*ptr = len;	// 将传入的内容进行复制到新开辟在堆中的内存空间
}

Line::Line(const Line &obj){
	cout << "调用拷贝构造函数并为指针ptr分配内存,即完成深拷贝" << endl;
	ptr = new int;	// 重新开辟出一块新的内存空间,完成深拷贝
	*ptr = *obj.ptr;	// 将待拷贝的,进行内容的赋值
}

Line::~Line(void){	// 析构函数
	cout << "释放内存" << endl;
	delete ptr;	// 将指针删除,此时在堆中的一并删除
}
int Line::getLength(void){
	return *ptr;	// 返回指向堆中int的内容
}
void Line::setLength(int length){
	*ptr = length;
}

void display(Line obj){	// 传入一个对象	创建了一个副本,此时有两份内存。同时储存着obj
	cout << "line 大小:" << obj.getLength() << endl;
	// 进行赋值
	obj.setLength(3);
	cout << "line 大小:" << obj.getLength() << endl;
}
// 主函数
int main(){
	// 进行拷贝初始化
	Line line1(10);
	//Line line3 = line1;

	Line line2 = line1;	// 调用拷贝构造函数,创建了一块新的空间

	display(line1);
	display(line2);

	cout << line1.getLength() << endl;

	line1.setLength(4);
	cout << line1.getLength() << endl;
	return 0;
}

友元函数

友元函数定义在外部,但是有权访问内部成员。

需要在原型中使用friend关键字

代码语言:txt
AI代码解释
复制
#include <iostream>

using namespace std;

class Box{
    double width;	// 缺省值为私有的
public:
    friend void printWidth(Box box);	// 定义友元函数,友元函数没有this指针
    void setWidth(double wid);
};

// 成员函数定义
void Box::setWidth(double wid){
    width = wid;
}

// 友元函数不是任何类的成员函数
void printWidth(Box box){
    // 友元函数可以访问类中的任何成员
    cout << "width of box" << box.width << endl;
}

int main(){
    Box* box = new Box();

    // 使用成员函数设置宽度
    box -> setWidth(10.0);

    // 使用友元函数输出宽度
    printWidth(*box);

    return 0;
}

this指针

每一个对象可以通过this指针访问自己的地址。

代码语言:txt
AI代码解释
复制
#include <iostream>

using namespace std;

class Box{
public:
    // 构造函数定义
    Box(double l = 2.0, double b = 2.0, double h = 2.0){
        cout << "开始输出值" << endl;
        length = 1;
        breadth = b;
        height = h;
    }
    double Volume(){
        return length * breadth * height;
    }
    int compare(Box box){
        return this -> Volume() > box.Volume();	// this指向调用的对象,返回一个布尔值
    }
private:
    double length;
    double breadth;
    double height;
};

int main(void){
    Box Box1(3.3, 1.2, 1.5);
    Box Box2(8.5, 6.0, 2.0);

    cout << Box1.compare(Box2) << endl;

    return 0;
}

类的静态成员

使用static关键字

常用于定义工具函数

静态成员函数,没有this指针,只能访问静态成员。

普通成员有this指针,可以访问类中的任意成员,静态成员函数没有this指针。

初始化使用

代码语言:txt
AI代码解释
复制
int Box::objectCount = 0;

至于为什么要在外面定义,因为要进行分配内存空间。

而类仅仅是定义。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++ 类和对象
类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数。
嵌入式视觉
2022/09/05
8650
C++ 类和对象
C++类和对象 的复习
int *me;//俺是一个没有对象的野指针 个人学习参考网站:http://c.biancheng.net/cplus/c2cpp/、https://www.runoob.com/cplusplus/cpp-classes-objects.html ---- 目录 类和结构体的区别 类的创建 构造/析构函数 友元函数 内联函数 类的静态成员 类访问修饰符 继承 特点 基类/派生类 多继承 运算符/函数重载 多态 类和结构体的区别 C++ 中保留了C语言的 struct 关键字,并且加以扩充。在C语言中,
[Sugar]
2022/09/21
5580
开发成长之路(6)-- C++从入门到开发(C++入门不难)
这已经是进入了第二个阶段了,此前如果C语言基础还没有打好的小伙伴可以再补一下C语言: 开发成长之路(1)-- C语言从入门到开发(入门篇一) 开发成长之路(2)-- C语言从入门到开发(函数与定制输入输出控制函数) 开发成长之路(3)-- C语言从入门到开发(讲明白指针和引用,链表很难吗?) 开发成长之路(4)-- C语言从入门到开发(距离开发,还差这一篇) 开发成长之路(5)-- C语言从入门到开发(仿ATM机项目,我写的第一个项目)
看、未来
2021/09/18
7660
C++ 类、继承、重载《Rice C++ 学习开发》
作者有个自己的想法,如果C语言编写开发中,能把面向对象的思想添加进去,可以让代码更加美观,更加简洁,特别是代码复用。要让代码实现《高内聚、低耦合》,这样写代码才比较有意义。工作一年后,发现读大学的时候,做项目的代码感觉就像一坨shi一样。只要想到什么就写什么,完全没有代码复用的概念。
Rice加饭
2022/05/09
6490
C++OOP对象和类
本文将从入门的角度介绍C++OOP中的类和对象,事实上C++的类和对象远远不止本文所介绍的内容。
SimpleAstronaut
2022/08/09
4050
C++OOP对象和类
开心档之C# 类(Class)
类的成员函数是一个在类定义中有它的定义或原型的函数,就像其他变量一样。作为类的一个成员,它能在类的任何对象上操作,且能访问该对象的类的所有成员。
iOS Magician
2023/04/23
2270
C++ 类构造函数&解析函数
类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。构造函数 constructor,它通过声明一个与 class 同名的函数来定义。当且仅当要生成一个 class 的新的实例 (instance)的时候,也就是当且仅当声明一个新的对象,或给该 class 的一个对象分配内存的时候,这个构造函数将自动被调用。
嵌入式视觉
2022/09/05
1.6K0
C++ 类构造函数&解析函数
开心档之C++ 类 & 对象
C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。
爱学iOS的小麦子
2023/04/21
3070
C++ 重载运算符和重载函数
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。
狼啸风云
2020/10/28
2.1K0
c#类(class)
类的定义是以关键字class开始的,后面跟类的名称,类的主题包含一个花括号里,下面是类定义的一般格式。
酱紫安
2020/07/21
6800
C++ 类访问修饰符
数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。
嵌入式视觉
2022/09/05
5160
C++ 类访问修饰符
C++雾中风景1:友元类与面向对象
开篇先简单介绍一下友元这个概念吧。 在C++之中,类的友元函数是定义在类外部,但它有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。
HappenLee
2018/09/05
7780
C++面向对象编程一些拾遗
虽然说是拾遗,但是这里有一大部分是我以前没有看过的,简书的markdown不支持生成目录,可能需要手动来一个了。
和蔼的zhxing
2018/09/04
7030
C++面向对象编程一些拾遗
C++ this 指针
在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。
狼啸风云
2020/07/26
1K0
一文让你学完C++,干货收藏!!!
C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
小林C语言
2020/04/03
3K0
【C++】类和对象(下)
1.之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅ 式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成 员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。
用户11375356
2024/11/22
270
【C++】类和对象(下)
C++ 类的静态成员
我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化,如下面的实例所示。
用户7272142
2023/10/19
2600
C++面向对象程序设计
结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了
浪漫主义狗
2022/09/28
1.2K0
大学C++课程提炼概括【C++笔记】
如果未写明限制幅(public: private: protected: )则默认为私有
来杯Sherry
2023/05/25
4010
【编码狂想】解谜OOP:通过实战揭秘面向对象编程的奥秘
采用封装的思想设计一个立方体类(Cube),成员变量有:长(length)、宽(width)、高(height),都为 int 类型;
SarPro
2024/02/20
1500
相关推荐
C++ 类和对象
更多 >
LV.2
春艮尧软件研发
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文