C++学习之类与对象

本文详细介绍了C++中的类和对象的概念,包括类的定义、访问控制属性(public, private, protect)、对象的创建、成员函数的编写(包括内联函数)、构造函数与析构函数的作用和用法,以及类的成员组合。通过实例解析了如何初始化类对象、使用构造函数和析构函数,以及复制构造函数的调用场景。" 84029157,8203409,Unity3D:查找隐藏对象的技巧与性能分析,"['Unity3D开发', '游戏对象管理', '性能优化', '对象查找']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.类的定义

class Clock{
public:
	void setTime(int newH, int newM, int newS);
	void showTime();
private:
	int hour,minute,second;
};

注意,类在定义完成之后,一定要加上一个分号“;”这里定义了一个时钟Clock类,类包含数据成员函数成员,还可以在定义数据成员时对其进行初始化,例如:

private:
	int hour=0,minute=0,second=0;

2.类成员具有哪些访问控制属性
有三种访问控制属性:public(公有类型),private(私有类型),protect(保护类型;私有类型的成员只能被本类的成员函数访问,类外部的任何访问都是非法的;保护类型的成员的访问性质与私有成员相同,只是在继承当中存在差异;公有成员可以在类外进行访问,它可以看作是类对外部的接口。
3.定义一个类的对象
例如:Clock myClock;,对象只能访问类的公有成员,访问方式如:myClock.showTime();,采用“.”操作符。
4.类的成员函数的编写
成员函数的声明要在类体当中,简单的成员函数可以在类体中完成编写,复杂的成员函数在类体外编写,例如:

void Clock::setTime(int newH,int newM,int newS){
	hour=newH;
	minute=newM;
	second=newS;
}

可以看到,成员函数在调用类的对象时,不带“.”操作符,直接引用名字。
成员函数中有一种内联成员函数,当成员函数的定义比较简单时,且可能频繁调用,就可以将函数定义成内联函数,这种操作可以减少调用开销,提高执行效率,其定义包含显示声明和隐式声明两种,例如:

inline void Clock::showTime(){
	cout<<hour<<":"<<minute<<":"<<second<<endl;
}

这是一种显示声明,加入关键词inline,内联成员函数的函数体在编译时,被插入到每一个调用它的地方。隐式声明一个内联成员函数,就是直接把函数的定义写在类体当中。
5.构造函数与析构函数
在定义一个类的对象时,需要对其进行初始化,对象使用结束之后需要对其进行一些清理工作,这两项任务分别由类的构造函数和析构函数完成。
构造函数的特点:

  • 函数名与类名相同;
  • 不能定义返回值类型,也不能有return语句;
  • 可以有形参,也可以没有;
  • 可以是内联函数,也可以不是;
  • 可以重载;
  • 还可以带默认参数值。
    构造函数在对象被创建时自动调用,编译器会在对象被创建的地方自动插入所调用构造函数的代码,类中没有写构造函数时,编译器会自动生成一个构造函数,其参数列表和函数体均为空,即其不做任何操作,例如:
class Clock{
public:
	Clock(){};
	......
	};

也可以自定义一个带参数的构造函数,例如:

Clock::Clock(int newH=0,int newM=0,int newS=0){
	hour=newH;
	minute=newM;
	second=newS;
	}

定义了这样一个构造函数之后,在定义一个类时,可以这样进行初始化:Clock myClock(10,5,1);这时,定义了一个时间为10:5:1的Clock对象。自定义了构造函数之后,编译器不会再为之生成默认构造函数,因此,在定义一个对象时,必须给出初始值,否则会报错,例如:Clock c;这是不行的。但有时候我们定义对象时就喜欢这样定义,因此为防止出错,我们可以重载一个构造函数,该函数不需要形参,如下:

class Clock{
public:
	Clock(int newH=0,int newM=0,int newS=0);
	Clock(){
	hour=0;
	minute=0;
	second=0;
	};
	......
	};

复制构造函数是一种特殊的构造函数,当我们想要把一个对象完全复制给另一个对象时,复制构造函数就被调用,其形参是本类的对象的引用,作用是使用一个已经存在的对象去初始化一个同类对象。例如:

class Clock{
public:
	Clock(int newH=0,int newM=0,int newS=0);
	Clock(Clock &c);

类名(类名 &对象名);;当程序员没有定义复制构造函数时,系统会在必要时自动生成一个隐含的复制构造函数,其在使用时如下:

Clock c(10,5,1);
Clcok d(c);
Clock e=c;

复制构造函数在以下三种情况下会被调用:

  • 用类的一个对象去初始化另一个对象;
  • 函数的形参是类的对象,在形参与实参结合时,复制构造函数被调用(只有才值传递时才适合,传引用时没有调用复制构造函数);
  • 函数的返回值是类的对象,函数执行完成,返回给调用对象时;
    析构函数
    析构函数在对象的生存期即将结束的时候自动调用,调用完成之后,对象也就消失了,相应的内存空间也被释放。
    析构函数的特点:
  • ~类名(){};
  • 没有参数,没有返回值;
    例如:
class Clock{
public:
	 ~Clock(){}
	 ......
};

或者:

Clock::~Clock(){
}

6.类的成员组合
类的成员函数既可以是基本类型也可以是自定义类型,当然也可以是类的对象。类的组合描述的就是一个类内嵌其它类的对象作为成员的情况。在创建一个组合类的对象时,既要对本类的基本类型数据成员进行初始化,又要对内嵌对象成员进行初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值