C++转换构造函数的问题
转换构造函数我不是很懂我看到问问里有的人回答说转换构造函数是将某一个类型利用构造函数转换成类的对象。 这是什么意思呀??
把一个类型 变成这个类的一个对象?
有一个例子,
int a;
float b=(float) a;
是不是这样呀? 我还是看不懂~ 怎么就转了呀
那里面有什么东西产生质变了么?
追问:恩~明白了一点吧。现在知道了转换构造函数是在类型不一致的时候用做转换用的一个 构造函数 对吧。 但是,我记得书上说,类型转换可以是隐式的呀。而且,如果;没有构造函数的时候,系统会默认的给一个的。那,这个转换构造函数一定非要写出来不可么?
额~~不知道大侠用visual studio吗?想问一下,我在VS2008里面想给对话框添加WM_INITDIALOG这个消息映射,可是在消息框里面么有这个消息呀~~网上有人说在“ 重写 ”里面 可是重写在哪里呀?
大侠知道么?
楼上的ASP.NET我不懂哦~~ 没有学。现在在复习C++
答案:答案长不一定好。关于你的问题,可以这么说(什么是类你知道呗,而且什么是类的对象你也知道呗)。那么先说构造函数。首先,类只是定义了一些行为,他只是一个抽象,打个比方,鱼这个词就是一个抽象,“鱼”这个词只是说明了一种能在水里游的,具有某种样子的动物,而具体的一条鱼就是“鱼”这个"类"的对象。明白了类和对象的关系,再来说一下构造函数,所谓构造函数就是能够产生对象的函数,构造函数用传给他的参数造出一个由这些参数规定的一个类的具体的对象来,(当然传给他的参数也可以为空) 每个类都有构造函数,如果你定义的类中没写构造函数,那么编译器会给你自动添加一个。这个编译器自动为你添加的构造函数叫做“合成构造函数”。
要解释请楚你的问题,还要再讲一个概念,即类型转换,所谓类型转换,打个比方:如你写
int a=1;double b=1.2;int c;
c=a+ b;时,由于运算符“+”的两边类型不一致,故编译器按规则将a转换成double 型然后a+b得到double型的值2.2,现在遇上了 “=”运算符,两边类型又不一至,故编译器将double型的2.2转换成int型的值“2” ,再赋值。
现在可以解释转换构造函数了,如果你有类"Lei"的对象a;即(假设你重载了“+”运算符)
Lei a;(这里实际上已调用了类Lei的无参构造函数)
Lei c;
int b;(注意是 int)
若你写c=a+b;会怎样,若他像上面那样(由于你重载了“+”运算符,故编译器知道你想将两个Lei类型的对象相加),将b自动转换为Lei类型就好了,c++规定,若你定义了一个这样的构造函数的话,那么编译器将可以将b转换成Lei类型以便“c=a+b”能够执行。这个构造函数有一个名字,就叫做“转换构造函数”,它有一个参数,那就是(以上面为例)int型的,这个转换构造函数看起来应该是:
Lei::Lei(int canshu) :初始化列表
{something ;}
不要看这么多文字,但我感觉还是讲清楚了,如果你还不懂,可以再问
我没有看出来你的例子和构造函数有什么关系。
如果说代码中产生了质变,
那就是b在初始化的时候,接受了一个float类型的值而已。
------------
所谓构造函数,是指特定场景的方法,可以用来在创建对象时初始化对象。
脱离了类,也就不存在构造函数这个东西。
不是这样的
如果下面的文字看不明可以问我547474147
我们先说一下什么是构造函数。
上一个教程我们简单说了关于类的一些基本内容,对于类对象成员的初始化我们始终是建立成员函数然后手工调用该函数对成员进行赋值的,那么在c++中对于类来说有没有更方便的方式能够在对象创建的时候就自动初始化成员变量呢,这一点对操作保护成员是至关重要的,答案是肯定的。关于c++类成员的初始化,有专门的构造函数来进行自动操作而无需要手工调用,在正式讲解之前先看看c++对构造函数的一个基本定义。
1.C++规定,每个类必须有默认的构造函数,没有构造函数就不能创建对象。
2.若没有提供任何构造函数,那么c++提供自动提供一个默认的构造函数,该默认构造函数是一个没有参数的构造函数,它仅仅负责创建对象而不做任何赋值操作。
3.只要类中提供了任意一个构造函数,那么c++就不在自动提供默认构造函数。
4.类对象的定义和变量的定义类似,使用默认构造函数创建对象的时候,如果创建的是静态或者是全局对象,则对象的位模式全部为0,否则将会是随即的。
我们来看下面的代码:
#include <iostream>
using namespace std;
class Student
{
public:
Student()//无参数构造函数
{
number = 1;
score = 100;
}
void show();
protected:
int number;
int score;
};
void Student::show()
{
cout<<number<<endl<<score<<endl;
}
void main()
{
Student a;
a.show();
cin.get();
}
在类中的定义的和类名相同,并且没有任何返回类型的Student()就是构造函数,这是一个无参数的构造函数,他在对象创建的时候自动调用,如果去掉Student()函数体内的代码那么它和c++的默认提供的构造函数等价的。
构造函数可以带任意多个的形式参数,这一点和普通函数的特性是一样的!
下面我们来看一个带参数的构造函数是如何进行对象的始化操作的。
代码如下:
#include <iostream>
using namespace std;
class Teacher
{
public:
Teacher(char *input_name)//有参数的构造函数
{
name=new char[10];
//name=input_name;//这样赋值是错误的
strcpy(name,input_name);
}
void show();
protected:
char *name;
};
void Teacher::show()
{
cout<<name<<endl;
}
void main()
{
//Teacher a;//这里是错误的,因为没有无参数的构造函数
Teacher a("test");
a.show();
cin.get();
}
我们创建了一个带有字符指针的带有形参的Teacher(char *input_name)的构造函数,调用它创建对象的使用类名加对象名称加扩号和扩号内参数的方式调用,这和调用函数有点类似,但意义也有所不同,因为构造函数是为创建对象而设立的,这里的意义不单纯是调用函数,而是创建一个类对象。
一旦类中有了一个带参数的构造函数而又没无参数构造函数的时候系统将无法创建不带参数的对象,所以上面的代码
Teacher a;
就是错误的!!!
这里还有一处也要注意:
//name=input_name;//这样赋值是错误的
因为name指是指向内存堆区的,如果使用name=input_name;会造成指针指向改变不是指向堆区而是指向栈区,导致在后面调用析构函数delete释放堆空间出错!(析构函数的内容我们后面将要介绍)
如果需要调用能够执行就需要再添加一个没有参数的构造函数
对上面的代码改造如下:
#include <iostream>
using namespace std;
class Teacher
{
public:
Teacher(char *input_name)
{
name=new char[10];
//name=input_name;//这样赋值是错误的
strcpy(name,input_name);
}
Teacher()//无参数构造函数,进行函数重载
{
}
void show();
protected:
char *name;
};
void Teacher::show()
{
cout<<name<<endl;
}
void main()
{
Teacher test;
Teacher a("test");
a.show();
cin.get();
}
创建一个无阐述的同名的Teacher()无参数函数,一重载方式区分调用,由于构造函数和普通函数一样具有重载特性所以编写程序的人可以给一个类添加任意多个构造函数,来使用不同的参数来进行初始话对象。
现在我们来说一下,一个类对象是另外一类的数据成员的情况,如果有点觉得饶人那么可以简单理解成:类成员的定义可以相互嵌套定义,一个类的成员可以用另一个类进行定义声明。
c++规定如果一个类对象是另外一类的数据成员,那么在创建对象的时候系统将自动调用那个类的构造函数。
下面我们看一个例子。
代码如下:
#include <iostream>
using namespace std;
class Teacher
{
public:
Teacher()
{
director = new char[10];
strcpy(director,"王大力");
}
char *show();
protected:
char *director;
};
char *Teacher::show()
{
return director;
}
class Student
{
public:
Student()
{
number = 1;
score = 100;
}
void show();
protected:
int number;
int score;
Teacher teacher;//这个类的成员teacher是用Teacher类进行创建并初始化的
};
void Student::show()
{
cout<<teacher.show()<<endl<<number<<endl<<score<<endl;
}
void main()
{
Student a;
a.show();
Student b[5];
for(int i=0; i<sizeof(b)/sizeof(Student); i++)
{
b[i].show();
}
cin.get();
}
上面代码中的Student类成员中teacher成员是的定义是用类Teacher进行定义创建的,那么系统碰到创建代码的时候就会自动调用Teacher类中的Teacher()构造函数对对象进行初始化工作!
这个例子说明类的分工很明确,只有碰到自己的对象的创建的时候才自己调用自己的构造函数。
一个类可能需要在构造函数内动态分配资源,那么这些动态开辟的资源就需要在对象不复存在之前被销毁掉,那么c++类的析构函数就提供了这个方便
你的例是想表达不同类型数据之间转换的意思,
上一个:C++实现单向链表的问题
下一个:跪求C++图书管理系统。。。