C++类和对象

1.基本知识:

2.实例化对象

类是抽象的,不能赋值,但是实例化的类即对象就能赋值了,而且通过类对象可以直接调用函数。

//eg:
Car mycar=new Car()

 类名 对象名=new 类名()

3.类的属性

又称为类的数据成员,用来表示类的信息;

声明方法与声明变量的方法类似:

类的数据成员特例:——静态数据成员

static关键字修饰的数据成员,在定义类对象时,不会为每个类对象复制一份静态数据成员,而是让所有的类对象都共享一份静态数据成员备份。

static <数据类型》 <属性>

静态变量在定义时就要初始化;

 4.类的方法——成员函数

4.1成员函数主要处理类的数据成员,声明方法和普通的函数的声明方法相同;

但是有两种方式:(1)类体中声明与定义

(2)类体中声明,类体外定义;

第一种:就和普通函数声明类似

第二种:在函数内:<函数返回类型> <函数名>()

              在函数外:<函数返回类型><类名>::<成员函数名>(参数)

class person
{
	int id;
	int age;
	void hi()
	{
		cout << "hi,it is an example" << endl;
	}
};

//第二种
class person
{
	int id;
	int age;
	void hi();
};
void person::hi()//::是范围解析运算符
{
	cout << "hi,it is an example" << endl;
}

 4.2 静态成员函数

用static修饰的成员函数,被定义为静态的函数,在类的各个实例化间是共享的,不会为每一个类的实例都创建一个静态成员函数的实现;

class Student
{
	static void setcounter(int);
	void show();
};

void Student::setcounter(int a)
{
}

void Student::show()
{
	cout << "i miss you" << endl;
}

 static <函数返回类型> <成员函数名>(参数列表)

4.3成员函数的类别(const的另一种用法)

把保留字放在参数列表和函数体之间,称为const成员函数。const成员函数只能读类数据成员,而不能修改类成员数据

类内定义与类外定义

类型 函数名(参数列表) const
{
	函数体
}

类型 类名::函数名(参数列表) const
{
	函数体
}

无论是类内定义和类外定义都要加const,否则编译器会把其看成一个不同的函数;

5.特殊的成员函数——构造函数与析构函数

在类中声明数据成员的时候是不能给数据成员赋初值的

在C++中利用构造函数来解决这个问题:

构造函数:在类中定义的一种特殊的成员函数,该成员函数的名称与类的名称相同,不能有返回类型,也不能有return 语句;

主要功能:为对象分配空间,为类数据成员赋初值

性质:

名字必须与类的名字相同;

且参数可以是任何数据类型,但是没有返回值,所以不能为其定义返回类型,包括void,所以就只是:类名();

当创建对象时,编译系统会自动调用构造函数

具有一般的成员函数的所有性质,可以访问类的所有成员。可以带参数表,可以带有默认的参数值,还可以重载;(见下文吧)

同样可以用类体内和类体外这两种方式来进行初始化;
class Rectangle
{
	double length, width;
	Rectangle(double a, double b)
	{
		length = a;
		width = b;
	}
	void area()
	{
		cout << length * width << endl;
	}
};

class Rectangle
{
	double length, width;
	Rectangle(double a, double b);
	void area()
	{
		cout << length * width << endl;
	}
};

Rectangle::Rectangle(double a, double b)
{
	length = a;
	width = b;
}

一般情况下在声明类的时候都要给类声明和定义构造函数,如果没有声明,编译系统会自动生成,但是只开辟空间并不不会赋初值,所以可能会报错,所以尽量声明定义构造函数

//不需要显式调用,在声明类对象的时候会自动调用构造函数;

不带参数的构造函数

构造函数可以不带参数,但是不带参数的构造函数的初始化是固定的;

【带有默认参数的构造函数】

//带有默认参数的构造函数,就属于那种你给它传参他就接受,你不传他就是默认的值

class Rectangle
{
	double length, width;
public:
	Rectangle(double a = 0.0, double b = 0.0);//就是在函数声明的时候就直接给出默认的值
	double area();
};

Rectangle::Rectangle(double a, double b)
{
	length = a;
	width = b;
}

int main()
{
	Rectangle ob1;
	Rectangle ob2(1.5, 2.0);
	Rectangle ob3(2.5);//此时只传递一个参数,那么将这个参数按顺序传递,传递给length,而没有参数的就默认为0;
}

在这里尤其需要注意:ob3,在这里只有一个参数,一定是按声明的顺序传递,而在类的声明中length是首先被声明的,所以这个值被传递给length;

【构造函数的重载】

C++支持函数的重载,一个类中也可以有多个不同的参数形式的构造函数。用类去创建一个对象(后面可以附带参数),也就是在内存中产生一个类的实例,程序将根据参数自动调用该类中对应的构造函数就是根据不同的参数类型来调用不同的构造函数

构造函数的区分:(1)参数的个数;(2)参数的类型;

在实例化对象时,传递的参数不一样(比如:有的传递两个参数,有的传递一个参数,有的不传递参数);而构造函数就是根据传递的参数来区分选择不同的构造函数;

class Dot
{
private:
	double a, b;
public:
	Dot();
	Dot(double x, double y);
	void showDot();
};

Dot::Dot()
{
	a = 0.0;
	b = 0.0;
}

Dot::Dot(double x,double y=5.5)
{
	a = x;
	b = y;
}

void Dot::showDot()
{
	cout << a << " " << b << endl;
}

int main()
{
	Dot dot1;
	dot1.showDot();
	Dot dot2(10);
	dot2.showDot();
	Dot dot3(1.1, 2.0);
	dot3.showDot();
}

【特殊的构造函数】——复制构造函数

用一个已经存在的对象来初始化该类的对象;

分为:(1)用户自定义复制构造函数(2)系统默认复制构造函数

类名(类名&对象名)

class Dot
{
private:
	double a, b;
public:
	Dot(Dot& d);//声明自定义复制构造函数;已经存在的对象d来初始化该类的对象
	Dot(double x, double y);//声明构造函数
	void showDot();
};

Dot::Dot(Dot& d)
{
	a = d.a + 10;//取d的值来初始化
	b = d.b + 20;
}

Dot::Dot(double x, double y)
{
	a = x;
	a = y;
}

void Dot::showDot()
{
	
}

int main()
{
	Dot dot1(1.1, 2.2);
	cout << "the a and b of dot1: " << endl;
	dot1.showDot();
	Dot dot2(dot1);//用复制构造函数来创建对象
	dot2.showDot();
}

而当我们使用一个已经存在的对象初始化本类的对象时,如果没有自定义复制构造函数,系统将会自动生成一个默认的复制构造函数来完成初始化的工作;此时默认的值为0;

【析构函数】

作用:释放分配给对象的内存空间,做善后的工作;

注意:(1)析构函数的名字必须与类名相同,但是在类名的前面要加~;

(2)析构函数没有参数,没有返回值,不能被重载,在一个类中只能有一个析构函数

(3)当撤销对象时,系统会自动调用析构函数,完成空间的释放和善后工作!

当程序结束时程序调用析构函数;

当然析构函数也可以显式调用:<类对象>.<析构函数>()

但是需注意,当存在析构函数中存在delete[]类似内存释放的功能时,我们最好不要显式调用析构函数,程序可能会报错!而在一般情况下,可以调用析构函数;

【函数和类的关系】

类对象可以作为函数的参数,也可以作为函数的返回值;类对象作为函数参数传递时,可以值传递和引用传递;

类对象值传递时,实参中的成员变量目录中的变量被复制到形式参数中相应的成员变量!

【this指针】

隐含在成员函数内的一种指针,称为指向本对象的指针;可以采用this->数据成员  的方式来存取类的数据成员; 

作用:(1)显示指明类中的数据成员,尤其是和形参及全局变量相区分;

(2)返回本对象的指针和引用;在函数成员返回时,如果需要返回该对象的指针,只需使用return this,在返回本对象的引用时只需使用return this

(3)类对象值传递时,实参中的成员变量被复制到形式参数中相应的成员变量;

  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值