
选C。
Class CStudent{
public:
CStudent(); //A缺省构造函数
CStudent(int iYear){m_iyear = iYear} //B转换构造函数
CStudent(const CStudent& tStudent) //C拷贝构造函数
{
m_strName = tStudentm_strName;
m_iYear = tStudentm_iYear;
};
CStudent& operator=(CStudent tStudent) //D赋值运算符
{
m_strName = tStudentm_strName;
m_iYear = tStudentm_iYear;
return this;
}
public:
CString m_strName; //名字
int m_iYear; //年龄
}
这里因为是声明Jack对象,所以应该默认执行C拷贝构造函数,
如果先声明过Jack了,比如CStudent Jack;
Jack = Tom;
这时候应该执行的是D赋值运算符。
所以应该选C。额最好写个代码试试看。。。我也没试。。根据我经验应该是执行的拷贝构造函数
摘 要:构造函数与析构函数是一个类中看似较为简单的两类函数,但在实际运用过程中总会出现一些意想不到的运行错误。本文将较系统的介绍构造函数与析构函数的原理及在C#中的运用,以及在使用过程中需要注意的若干事项。
关键字:构造函数;析构函数;垃圾回收器;非托管资源;托管资源
一.构造函数与析构函数的原理
作为比C更先进的语言,C#提供了更好的机制来增强程序的安全性。C#编译器具有严格的类型安全检查功能,它几乎能找出程序中所有的语法问题,这的确帮了程序员的大忙。但是程序通过了编译检查并不表示错误已经不存在了,在“错误”的大家庭里,“语法错误”的地位只能算是冰山一角。级别高的错误通常隐藏得很深,不容易发现。
根据经验,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。微软利用面向对象的概念在设计C#语言时充分考虑了这个问题并很好地予以解决:把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。当对象被创建时,构造函数被自动执行。当对象消亡时,析构函数被自动执行。这样就不用担心忘记对象的初始化和清除工作。
二.构造函数在C#中的运用
构造函数的名字不能随便起,必须让编译器认得出才可以被自动执行。它的命名方法既简单又合理:让构造函数与类同名。除了名字外,构造函数的另一个特别之处是没有返回值类型,这与返回值类型为void的函数不同。如果它有返回值类型,那么编译器将不知所措。在你可以访问一个类的方法、属性或任何其它东西之前, 第一条执行的语句是包含有相应类的构造函数。甚至你自己不写一个构造函数,也会有一个缺省构造函数提供给你。
class TestClass
{
public TestClass(): base() {} // 由CLR提供
}
下面列举了几种类型的构造函数
1)缺省构造函数
class TestClass
{
public TestClass(): base() {}
}
上面已介绍,它由系统(CLR)提供。
更多内容请参照以下网页
http://wwwyeskycom/351/1755351shtml
一共有三页
1 编译器所做的工作等效于:
class Empty {
public:
Empty(){} // 缺省构造函数
Empty(const Empty &rhs){} // 缺省拷贝构造函数
~Empty(){} // 缺省析构函数
Empty & operator= (const Empty &rhs); // 缺省赋值运算符重载函数
};
2 如果 C++ 默认为你定义的这三类函数不合你的要求,这也是经常发生的,那么你就需要结合实际情况,定制出最适合自己的函数。
3 这三类函数非常重要,请一定要确保其正确性,效率性,否则项目后期因此而产生的内存泄露等问题是非常让人头大的。
类的设计思想:
构造函数,可以给点赋初值的构造函数
设计成员函数,如取得坐标值的函数,此点和原点之间的距离
代码:
#include<iostream>#include <mathh>
class Point{
protected:
double x;//定义横坐标
double y;//定义纵坐标
public:
Point(double x,double y){//带参数的构造函数
this->x = x;//横坐标赋初值
this->y = y;//纵坐标赋初值
}
void setX(double x){//设定横坐标
this->x = x;
}
void setY(double y){//设定纵坐标
this->y = y;
}
double getX(){//取得横坐标
return this->x;
}
double getY(){//取得纵坐标
return this->y;
}
double distanceToOrigin(){//计算点到原点之间的距离
return sqrt(xx+yy);
}
};
int main()
{
Point p(1,2);//定义点p
std::cout << pdistanceToOrigin() << std::endl;//输出(1,2)到(0,0)之间的距离
return 0;
}
运行结果:
223607欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)