浅谈C++类与对象 知识

2021/6/30 22:21:21

本文主要是介绍浅谈C++类与对象 知识,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

浅谈C++类和对象

一、内联函数

1.在类内部写函数体 (隐式)

2.写关键字inline (显式)

二、构造、析构函数

对象的创建与初始化、对象生命期结束时的清理工作,分别由构造函数和析构函数完成。

(一)构造
构造函数的功能、特点

1.在定义对象时由系统自动调用来创建对象并初始化对象。

2.构造函数通常是对成员变量进行初始化
3.构造函数的函数名与类名相同。

构造函数初始化成员有两种方法

A.使用构造函数的函数体进行初始化
B.使用构造函数的初始化列表进行初始化

初始化列表形式:

funname(参数列表):初始化列表
{ 函数体,可以是空函数体 }
初始化列表的形式:
成员名1(形参名1),成员名2(形参名2),成员名n(形参名n)

class Date
{
	int d, m, y;
public:
	Date(int dd, int mm, int yy):d(dd),m(mm),y(yy)
	{			}

	Date(int dd, int mm): d(dd),m(mm)
	{               	}
}
必须使用参数初始化列表对数据成员进行初始化的几种情况

数据成员为常量
数据成员为引用类型
数据成员为没有无参构造函数的类的对象(有参构造函数的对象)

//数据成员为常量、数据成员为引用类型
#include <iostream>
using namespace std;
class A{
public:
	A(int i):x(i),rx(x),pi(3.14)
	{}
	void display()
	{cout<<"x="<<x<<"rx="<<rx<<"pi="<<pi<<endl;}
private:
	int x,&rx;
	const float pi;
};
int main(){
	A aa(10);
	aa.display();
	return 0;
}

//数据成员为没有无参构造函数的类的对象
#include <iostream>
using namespace std;
class ABC{
public:
	ABC (int x, int y, int z)	{a=x;b=y;c=z;}
private:
	int a,b,c;
};
class MyClass{
public:
	MyClass():abc(1,2,3)
	{}
private:
	ABC abc;
};
int main(){	MyClass myclass;  return 0;}
类成员的初始化的顺序

按照数据成员在类中的声明顺序进行初始化,与初始化成员列表中出现的顺序无关

构造函数的重载

带默认值的构造函数表示多种情况

(二)析构

析构函数自动调用(隐式调用),没有返回值,不能有参数,也不能重载一个类中只能有一个析构函数)!

构造、析构调用顺序

先造后析

三、复制构造

1.形式:

复制构造函数有且仅有一个参数,即是同类对象的引用

class  类名
{
public:
      类名(参数表);                //构造函数
      类名([const] 类名 &对象名);  //复制构造函数
       ...						//[ ]表示非必填 
};
类名::类名([const] 类名 &对象名)
{
     函数语句
}

2.调用

以下三种情况下由编译系统自动调用:
●声明语句中用类的一个已知对象初始化该类的另一个对象时。

●当对象作为一个函数实参传递给函数的形参时,需要将实参对象去初始化形参对象时,需要调用复制构造函数。

●当对象是函数的返回值时,由于需要生成一个临时对象作为函数返回结果,系统需要将临时对象的值初始化另一个对象,需要调用复制构造函数。(此时,也将调用析构销毁临时对象)

#include <iostream>
using namespace std;
class Box{
public:
	Box(int =10, int =10, int =10);
	Box(const Box & b)
	{height=2*b.height;  width=2*b.width;  length=2*b.length;}
	int volume();
private:
	int length, height, width;
};
Box::Box(int h, int w, int l):length(l),width(w),height(h)
{}
int Box::volume ()
{	return width*height*length;}
int main(){
	Box box1(1,2,3),box2(box1),box3=box2;
    		 //调用形式:对象(对象)或对象=对象
	cout<<"Box1's volume is "<<box1.volume()<<endl;
	cout<<"Box2's volume is "<<box2.volume()<<endl;
	cout<<"Box3's volume is "<<box3.volume()<<endl;
	return 0;
}

3.深浅复制
3.1 浅复制

默认复制构造函数所进行的是简单数据复制,用一个对象初始化另一个对象时,两个对象同时指向了同一资源(只复制数据,内存共用)的复制方式称为浅复制。

当类的数据成员含有指针类型时,浅复制构造函数存在问题。

3.2 深复制

一个对象初始化另一个对象时,不仅复制了数据成员,也复制了资源。深复制构造函数必须显式定义!

成员变量中含有指针变量时,需要定义深复制构造函数!

深复制构造函数的特点
定义:类名::类名([const] 类名 &对象名);
成员变量的处理:对指针类型的成员变量,使用new操作符进行空间的申请,然后进行相关的复制操作

Person::Person(const Person& P0) //复制构造函数的实现
{
   	 name=new char[strlen(P0.name)+1];
	strcpy(name,P0.name);
	age=P0.age;
	salary=P0.salary;
}

四、静态成员

同一个类不同对象数据成员的共享。包括:
●静态数据成员

static int total;

对于静态数据成员,每个类只拥有一个副本。

静态数据成员初始化:

类型 类名::静态数据成员=初始化值;

​ ●静态成员函数

  static void display(); 

静态成员函数属于整个类(不是某一个对象的成员)可以直接访问该类的静态数据成员,而不能直接访问非静态数据成员。

静态成员函数如要访问非静态成员,需要通过对象名才能访问该对象的非静态数据成员.

调用时,可以通过两种方式进行:

 Person::display();     //通过类名调用静态成员函数
 s4.display();        	//通过对象调用静态成员函数

五、友元

在类的外部直接访问类的私有数据成员,进行数据共享。

类外的非本类成员函数需要访问类的私有数据成员或保护成员,则需要将该函数声明为类的友元函数。友元函数不是类的成员函数!

友元函数声明格式:friend 返回值类型 函数名(参数表);

友元类的声明格式:friend class 类名; (在友元类中定义要访问的类的对象,以实现对类私有成员的访问)

六、常类型

解决数据共享与数据安全的统一

指使用关键字const说明,值在程序运行期间是不可改变的。

(一) 常引用
const  类型说明符  &引用名; 
(二)常对象
类名 const 对象名;
const 类名 对象名;

如果一个对象被说明为常对象,则通过该对象只能调用它的常成员函数。

(三)常对象成员

包括:

1.常成员函数
类型   函数名(参数表)  const;

●const是函数类型的一个组成部分,因此在函数的实现部分也要使用关键字const
●常成员函数不能修改对象的数据成员,也不能调用该类中没有由关键字const修饰的成员函数,从而保证了在常成员函数中不会修改数据成员的值
const可参与区分函数重载
●如果一个对象被说明为常对象,则通过该对象只能调用它的常成员函数。

2.常数据成员

类中说明的常数据成员,构造函数只能通过初始化列表对该数据成员进行初始化,而任何其他函数都不能对该成员赋值。

class A
{
public:
	A(int i);
	void print();
	const int &r;
private:
	const int a,b;
	static const int c;   
};
const int A::c=10;         //静态常数据成员在类外说明和初始化
A::A(int i):a(i),b(i),r(a)  //常数据成员只能通过初始化列表来获得初值
{
}
void A::print()
{
    cout<<a<<":"<<b<<":"<<c<<":"<<r<<endl;
}
void main()
{
    A a1(220),a2(80),a3(100);  
    a1.print();
    a2.print();
	a3.print();
} 


这篇关于浅谈C++类与对象 知识的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程