关于c++类中几种常用的函数讲解及实例讲解-创新互联

文章目录
    • 1、构造函数
    • 2、析构函数
    • 3、拷贝构造函数
    • 4、运算符重载
    • 5、 友元函数

说明:本文实例均采用vs 2022 c++控制台。

专注于为中小企业提供成都做网站、网站设计、外贸营销网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业左云免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了超过千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。1、构造函数

(1)函数名与类名相同。
(2)构造函数无函数返回类型说明。注意是没有而不是 void,即什么也不写,也不可写void!实际上构造函数有返回值,返回的就是构造函数所创建的对象。
(3)在程序运行时,当新的对象被建立,该对象所属的类的构造函数自动被调用,在该对象生存期中也只调用这一次。
(4)构造函数可以重载,但要满足重载的规则。
(5)构造函数可以在类中定义,也可以在类外定义。
(6)如果类说明中没有给出构造函数,则C++编译器自动给出一个缺省的构造函数系统:类名为(void){},但只要我们定义了一个构造函数,就不会自动生成缺省的构造函数。
(7)构造函数的参数可以有缺省值。
构造函数与new运算符之间有着紧密的联系,我们可以使用new对象运算符来动态地建立这个对象。建立时要自动调用构造函数,以便完成初始化对象的数据成员。最后返回这个动态对象的起始地址。用new运算符产生的动态对象,在不再使用这种对象时,必须用delete运算符来释放对象所占用的存储空间。
示例:

#pragma once
#include "iostream"
using namespace std;
class A
{public:
	float x, y;
public:
	A(float a, float b) {x = a; y = b; }//初始化
	A() {x = 0; y = 0; }
};
#include#include "A.h"
using namespace std;
int main(void)
{A *pa1, *pa2;
	pa1 = new A(3.0, 5.0);//使用new动态开辟对象空间
	pa2 = new A();
	cout<< pa1->x<< '\t'<< pa1->y<<'\n';
	cout<< pa2->x<< '\t'<< pa2->y;
	delete pa1;//用delete释放空间
	delete pa2;
	return 0;
}

运行结果:
在这里插入图片描述

2、析构函数

(1)析构函数名与类名相同、但在前面加上字符~,如~ CTrianle()。
(2)析构函数无函数返回类型,与构造函数在这方面是一样的。但析构函数不带任何参数
(3)一个类有一个也只有一个析构函数,这与构造函数不同。析构函数可以缺省:
(4)对象注销时,系统自动调用析构函数。
在定义一个对象时,系统会给出一个析构函数。但是我们有的时候,在程序的执行过程中,对象如果用new运算符开辟了空间,则在类中应该定义一个析构函数,并在析构函数中使用delete删除由new 分配的内存空间。因为在撤消对象时,系统自动收回为对象所分配的存储空间,而不能自动收回new分配的动态存储空间。
示例:

#pragma once
#include "string.h"
#include "iostream"
using namespace std;
class Str
{char* sp;size_t length;
public:
	Str(const char* string)
	{length = 0;
		if (string)
		{	length = strlen(string);
			sp = new char[length + 1];
			strcpy_s(sp,length+1,string);
		}
		else sp = 0;
	}
	~Str()
	{if (sp) delete sp;
	}
	void show(void)
	{cout<< sp<< endl;
    }
};
#include#include "Str.h"
using namespace std;
int main(void)
{Str s1("Studey c++");
	s1.show();
	return 0;
}

运行结果:
在这里插入图片描述

3、拷贝构造函数

(1)以类对象作为函数参数传值调用时
(2)函数返回值为类对象时
(3)用一个已定义的对象去初始化一个新对象时
示例:

#pragma once
class sanweizuobiao
{public:
	sanweizuobiao();
	sanweizuobiao(const sanweizuobiao& m);//拷贝构造
	~sanweizuobiao(void);
public:
	double dx;
	double dy;
	double dz;
public:
	double x() const {return dx; }//返回x坐标
	double y() const {return dy; }//返回y坐标
	double z() const {return dz; }//返回z坐标
};
#include "sanweizuobiao.h"
sanweizuobiao::sanweizuobiao()
{dx = 0;
	dy = 0;
	dz = 0;
}
sanweizuobiao::~sanweizuobiao(void)
{}
sanweizuobiao::sanweizuobiao(const sanweizuobiao& m)
{dx = m.dx;
	dy = m.dy;
	dz = m.dz;
}
#include#include "sanweizuobiao.h"
using namespace std;
int main(void)
{sanweizuobiao m,n;
	n.dx = 1.134556;
	n.dy = 2.465566;
	n.dz = 3.567878;
	m = sanweizuobiao(n);//调用拷贝构造
	cout<< m.dx<< '\n'<< m.dy<< '\n'<< m.dz;
	return 0;
}

运行结果:
在这里插入图片描述

4、运算符重载

运算符重载实际上是一种函数词用的形式。用成员函数重载运算符就是将运算符重载定义成一个类成员的函数的形式。通常将重载运算符的成员函数称为运算符函数。
示例:

#pragma once
class A
{public:
	float x, y;
public:
	A(float a = 0, float b = 0)
	{x = a; y = b;
	}
	A operator++()
	{A t;
		t.x = ++x;
		t.y = ++y;
		return t;//前置运算
	}
	A operator++(int)
	{A t;
		t.x = x++;
		t.y = y++;
		return t;//后置运算
	}
};
#include#include "A.h"
using namespace std;
int main(void)
{A a(2, 3), b,c;
	b = ++a;
	c = a++;
	cout<< a.x<< '\t'<< a.y<<'\n';
	cout<< b.x<< '\t'<< b.y<<'\n';
	cout<< c.x<< '\t'<< c.y;//因为a前置运算一次,后置运算一次,所以a的最终的值为4,5.b值是前置运算所以为3,4.c值是后置运算就是3,4
	return 0;
}

运行结果:
在这里插入图片描述

5、 友元函数

1、该函数不属于任何对象,其实就是一个全部函数,但是这个全局函数仅仅作用于该类的对象。
2、该函数可以访问该类的私有成员变量,公有的更加不用说了。
示例:重载运算符+号

#pragma once
#include "iostream"
using namespace std;
class A
{int i;
public:
	A(int a = 0)
	{i = a;
	}
	void show(void) {cout<< "i="<< i<< endl; }
	friend A operator+(A&, A&);
};
A operator+(A&a, A&b)
{A t;
	t.i = a.i + b.i;
	return t;
}
#include#include "A.h"
int main(void)
{A a1(10), a2(20), a3;
	a1.show();
	a2.show();
	a3 = a1+ a2;
	a3.show();
	return 0;
}

运行结果:
在这里插入图片描述

文章参考戴吾蛟老师主编的《测绘程序设计》编写,代码有所修改,并加入自己的理解,c++类撰写入门的小伙伴可参考!

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章名称:关于c++类中几种常用的函数讲解及实例讲解-创新互联
分享网址:http://myzitong.com/article/dihhhj.html