类中的一些特殊函数

8.7构造函数:

每个对象区别与其他对象的地方主要有两个:①外在的区别是的名称,②内在的区别是对象的名称。C++中,对象的初始化是由一个特殊的成员函数来完成的,称为构造函数。每个类都应该有自己的构造函数,它是类的成员函数。

构造函数必须满足的条件有两个:①构造函数的名字与类的名字相同;②构造函数没有返回值。一般情况下,构造函数有公共的访问属性。

关于构造函数,需要注意:

①对于某个类,可以定义多个同名的构造函数,这些构造函数之间形成函数的重载。

②构造函数的调用是在定义对象的时刻进行的,且调用的具体构造函数根据对象定义的形式来确定。

③如果在定义类时没有定义类的构造函数,编译系统会在编译时自动生成一个默认形式的构造函数,称为默认构造函数。默认构造函数是无参的函数。

8.8析构函数

形式:

Class Student{

public:

~student()

};

它是类的一个成员函数,它的名称是类的名字前加“~”构成,没有返回值。

关于析构函数,需要注意:

①由于它是无参的,名字又唯一,因此析构函数不能进行重载。

②析构函数的调用是在对象的删除的时刻进行的。

③如果没有定义析构函数,系统会自动生成一个,称为默认析构函数。

④默认析构函数只能用来释放对象的成员数据所占用的空间,但不包括堆空间的资源。因此,当构造函数中使用new运算符申请从堆中分配空间时,为了防止内存泄漏,需要具体定义析构函数,而不是使用默认析构函数。

8.9拷贝构造函数

拷贝构造函数是一种特殊的构造函数,其形式参数为本类对象的引用。

其形式Student (Student &pStudent);

常应用与以下3种情况:

①当用一个类的对象去初始化类的另一个对象时,系统会自动调用拷贝构造函数实现拷贝赋值。

②若函数的形参为类的对象,调用函数时,实参赋给形参,系统会自动调用拷贝构造函数实现拷贝赋值。

③当函数的返回值为类的对象时,系统调用拷贝构造函数实现拷贝赋值。

关于拷贝构造函数,需要注意:

①拷贝构造函数首先必须是构造函数,只是该函数要求其形参要多少本类对象的引用。

②若在类定义时没有显示地定义拷贝构造函数,系统会自动生成一个默认的拷贝构造函数,完成将类的成员一一复制的功能。

③拷贝构造函数与其他构造函数形成重载。

8.10浅拷贝和深拷贝

当定义拷贝构造函数时,只是完成一一对应的成员值的简单复制,称其为浅拷贝构造函数。但是,如果类的数据成员包含指针变量,类的构造函数必须使用new运算符为这个指针动态申请堆空间。如果此时还只是使用浅拷贝的方式进行对象的复制。最后,在退出运行时,由于两个对象的指针指向同一个堆空间资源,当调用析构函数先后删除这两个指针的堆空间中的资源时,程序会出错。为了解决此问题,必须定义深拷贝构造函数。

#include<iostream>
#include<cstring>
using namespace std;
class Student{
	public:
		Student(int pId,char* pName,char pSex);
		~Student();//析构函数声明
		Student(Student &stu);//深拷贝构造函数声明
		void printStudent();
		private:
			int id;
			char* name;
			char sex;
};
Student::Student(int pId,char *pName,char pSex)
{
	cout<<"constructing..."<<endl;
	id=pId;
	name=new char[strlen(pName)+1];
	if(name!=0)
	strcpy(name,pName);
	sex=pSex;
}
Student::Student(Student& stu)//深拷贝函数
{
	cout<<"deep copy contructing..."<<endl;
	id=stu.id;
	name=new char[strlen(stu.name)+1];
	if(name!=0)
	strcpy(name,stu.name);
	sex=stu.sex;
}
Student::~Student()
{
	cout<<"destructing..."<<endl;
	delete[] name;
}
void Student::printStudent()
{
	cout<<"id: "<<id<<","<<"name: "<<name<<","<<"sex: "<<sex<<endl;
}
int main()
{
	Student stu(1,"wang",'M');
	Student stu1=stu;
	stu.printStudent();
	stu1.printStudent();
    return 0;
}
时间: 2024-10-07 02:11:32

类中的一些特殊函数的相关文章

C++学习 之 类中的特殊函数和this指针

1.构造函数 构造函数是一种特殊的函数,它在对象被创建时被调用,与类同名无返回类型,可以被重载.构造函数的可以在类内实现也可以在类外实现. 构造函数的声明类似于下面的代码: class Human { public: Human();//构造函数声明 }; 构造函数在类声明中实现类似于下面的代码: class Human { public: Human () { //构造函数的实现部分 } }; 构造函数在类的声明外实现类似于下面的代码: class Human { public: Human

C++类中的特殊成员函数-------复制构造函数

在C++中存在一个特殊函数,他就是复制构造函数,假如我们有类A,如果有A a;A b=a;   在这种情况下利用A类变量a来给同是A类变量的b来赋值,这个时候类会使用复制构造函数,如果我们不显式声明复制构造函数,那么类将会调用默认的复制构造函数.下面的代码说明了这一情况,如果我们将类StringBad中的复制构造函数StringBad(StringBad &)去掉,那么count最后输出的结果会为复制(count为静态变量用来记录类StringBad的对象个数). main.cpp #inclu

静态修饰符static,类中的常量定义修饰符

static可以用来区分成员变量.方法是属于类本身还是属于类实例化后的对象.有static修饰的成员属于类本身,没有static修饰的成员属于类的实例. 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失static是一个修饰符,用于修饰成员(成员变量和成员函数)静态成员随着类的加载而加载.静态成员优先于对象存在.静态成员被所有对象所共享静态成员多了一个中调用方式,可以被类名直接调用.静态的优缺点优点: 静态成员多了一种调用方式.可以直接被类名调用 格式 :类名.静态成员.也

检测某个方法是否属于某个类中--解析php函数method_exists()与is_callable()的区别

php函数method_exists() 与is_callable()的区别在哪?在php面相对象设计过程中,往往我们需要在调用某一个方法是否属于某一个类的时候做出判断,常用的方法有 method_exists()和is_callable() 相比之下,is_callable()函数要高级一些,它接受字符串变量形式的方法名作为 第一个参数,如果类方法存在并且可以调用,则返回true.如果要检测类中的方法是否能被调用,可以给函数传递一个数组而不是类的方法名作为参数.数组必须包含对象或类名,以将其作

servlet类中ServletConfig及ServletContext

在一个继承了servlet接口的类中: ServletConfig: 代表:代表了以了一个servlet标签 <servlet> <servlet-name>AServlet</servlet-name> <servlet-class>com.neuedu.path.AServlet</servlet-class> </servlet> 获取:在init方法的参数中. 作用: 获取servlet的名字(web.xml 中的对应的ser

Static在类中的作用

static 在类内用于定义静态成员.静态成员与具体的类无关,它的值及作用范围适用于所有的类,当它的值发生改变时,在所有的类中的值都会发生变化.并且,类内的Static成员,应在类外重新定义一次. 类的静态成员一般不应该在类内初始化.如初始化,必须使用constexpr进行修饰,成为一个常量. constexpr的作用是修饰一个常量,并在编译期检查一个表达式是否是常量表达式.

增强一个Java类中的某个方法的几种方式

      * 一种方式:继承的方式.  * 能够控制这个类的构造的时候,才可以使用继承. Connection是一个接口,实现类不确定(由各厂商提供),无法使用此方法     * 二种方式:装饰者模式方式.         * 包装对象和被包装的对象都要实现相同的接口.         * 包装的对象中需要获得到被包装对象的引用.         ***** 缺点:如果接口的方法比较多,增强其中的某个方法.其他的功能的方法需要原有调用.     * 三种方式:动态代理的方式.         

C++程序设计方法3:类中的静态成员

在类型前面加static修饰的数据成员,是隶属于类的,成为类的静态数据成员,也称为"类的变量" 静态数据成员被该类的所有对象共享(即所有对象中的这个数据域实际上处于同一个内存位置) 静态数据要在实现文件中赋初值,格式为: Type ClassName::static_var = Value; 返回值类型前面加static修饰的成员函数,称为静态成员函数,它们不能调用非静态成员函数: 类的静态成员(数据,函数)既可以通过对象来访问,也可以通过类名字类访问: #include <io

Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)

作者:Antonio Leiva 时间:Mar 21, 2017 原文链接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每种语言一样,在Kotlin中,已经预定义了一些操作符执行一定的操作. 最典型的是加(+),减(-),乘(*),除(/),而且还有很多. 类似Java这样的一些语言,这些操作符被限制在一些特定的数量类型上,且没有方法让其他类型数据使用这些操作符. 还有在像Scala这样的其他语言中,由于函数名称可接受任何符号,我