C++面向对象编程之类的使用(从struct到class的进阶)

一、结构体的使用

1、C语言中struct的使用

struct stu1{
	int a;
	float b[8];
	double c;
};

2、C++中带函数的struct

struct stu2{
	int ids;
	int age;
	char name[10];
	//C++在结构体中可以定义函数 
	void pri()
	{
		cout << "I am " << name << ",age is "  << age << ",id is "  << ids << endl;
	}
}; 

3、C++中结构体的赋值与调用

//给C++的结构体赋值
void load()
{
	stu2 student;  //结构体对象student 
	student.ids = 12345;
	student.age = 23;
	strcpy(student.name, "Chung"); 
	//调用C++结构体中的函数	
	student.pri();
}

二、由结构体到类

1、结构体与类的区别
(1)结构体是值类型,类是引用类型

(2)结构体成员不能在声明时赋值初始值,类可以(实际上,C#类成员初始化代码会被编译器放到构造函数中的最前边部分执行,而C++中根本没有这种方式,只能声明成员)
不能为结构体提供无参构造函数(类中如果提供了自定义构造函数,就不会再提供默认无参构造函数。)

(3)默认可访问性:结构体的成员默认public,类的成员默认private

(4)结构体可以像类一样通过new 构造函数()来创建实例,也可以声明实例之后再赋值。

(5)结构体在自定义构造函数中必须为所有成员赋值。

(6)结构不允许声明析构函数(Destructor),类则无此限制

(7)结构体成员不能从继承自其他类或结构体,也不能被其他类或结构体继承(但可以实现接口),然而类可以(注意,所有的值类型都默认从ValueType类继承,ValueType类再从Object类继承。所以结构体对象仍然拥有超类Object的成员)。

(8)结构体之间的比较,可以使用Equals,而不能使用==操作符。且当结构体有成员是引用类型时,成员的比较是用 Object.ReferenceEquals 实现,即该引用类型的成员是否指向相同的引用(可能会让人误解,因为使用者可能只是想比较数值相同)

2、何时使用类何时使用结构体

  • 因为结构体是值类型,自身存储在栈上,主要用于轻量级对象,用来存储简单的数据(此时结构体的成员也大部分是值类型)。
  • 因为类是引用类型,可以抽象、继承等,适合存储重量级对象,拥有复杂逻辑(结构体不能被继承,也不能继承自其他,不能用abstract关键字等)

三、C++类的定义与使用

1、引入类(class)

其实类和结构体是非常相似的,只是比结构体更具体化。在C++里面,结构体能定义函数,类也能,因此C++中的类与结构体几乎的没有区别的,有时候将struct改为class都没有问题。

类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数。

简单来说,类就是将事物抽象成属性和行为,并将其封装在一起的一种引用类型。

2、类的基本用法
#include <iostream>  //标准输入输出流
using namespace std;  //声明一段命名空间 ,且必须定义在全局范围内  

class Who
{
	public:
		//属性
		int id;
		int age;
		//行为
		void Who_do()
		{
			cout << age << "岁大的" << id << "正在睡觉。" << endl; 
		} 
};  //结尾id分号一定不能忘记 

int main()
{
	//通过类实例化一个对象 
	Who People;
	//默认类中的成员都是私有的,因此不能这样访问:People.age;
	//结构体中所有的成员默认都是公有的,但类中的成员默认是私有的,加了public才是公有的
	People.age= 23;
	People.id= 12345;
	People.Who_do();  
} 

注意:无论是struct结构体还是class类的定义,都需要在结尾后添加一个分号,代表一条语句的结束。

3、类的访问权限
  • public:共有部分,类内(类中的函数)类外(类的实例化对象)都可以直接访问
  • protected:保护部分,类外(对象)不能访问;类内(类中函数)可以访问 ,在继承中子类可以访问
  • private:私有部分, 类外不能访问,类内可以访问 ,在继承中子类不能访问

注意:量设置成员变量为私有权限private,可以给变量设置只读、只写、可读可写等权限,同时给它们在共有public部分设置对应的接口

4、类的成员函数与接口定义

(1)普通函数处理

#include <iostream>
using namespace std;

class Time  //类Time,用来存放函数变量的 
{
public:
	int hour;
	int minute;
	int sec;
};
void set_time(Time&);  //函数声明
void show_time(Time&); 
int main() 
{
	Time t1;  //定义Time类的对象t1 
	set_time(t1);  //传入对象 ,函数接收对象需要用引用类型
	show_time(t1);
	Time t2;
	set_time(t2);
	show_time(t2);
	return 0; 
}
void set_time(Time &t)  //设置值函数 
{
	cin >> t.hour;
	cin >> t.minute;
	cin >> t.sec;
}
void show_time(Time &t)  //输出值函数 
{
	cout << t.hour << ":" << t.minute << ":" << t.sec << endl;
}

(2)使用成员函数处理

#include <iostream>
using namespace std;

class Time
{
public:
	void set_time();  //公共成员函数 
	void show_time();
private:
	int hour;
	int minute;
	int sec;
};
int main()
{
	Time t1;  //对象t2 
	t1.set_time();
	t1.show_time();
	Time t2;
	t2.set_time();
	t2.show_time();
	return 0;
}
void Time::set_time()  //在类外定义函数,需要使用::符号
{
	cin >> hour;
	cin >> minute;
	cin >> sec;
} 
void Time::show_time()
{
	cout << hour << ":" << minute << ":" << sec << endl;
}

(3)成员函数的接口定义

#include <iostream>  //标准输入输出流
using namespace std;  //声明一段命名空间 ,且必须定义在全局范围内 

class People
{
//在共有部分定义相应的接口 
public:
	//对只读属性进行只读访问 
	int getReadOnly(){return readOnly;
	}
	//对只写属性进行只写访问
	void setWriteOnly(int lins){writeOnly= lins;
	} 
	//对可读可写属性进行可读可写访问  
	void setReadWrite(int lins){readWrite= lins;		
	}
	int getReadWrite(int lins){return readWrite;
	}
private:
	int readOnly;
	int writeOnly;
	int readWrite;
};

int main()
{
	People chung;  //根据类People实例化对象chung
	chung.getReadOnly();
	chung.setWriteOnly(123);
	chung.getReadOnly();
	chung.getReadWrite(456); 
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸿蒙Next

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值