看到String str = new String("content")时想到一个问题:在我印象里,构造函数时没有返回值的,那么创建的对象是如何赋值的呢?有没有方法确定知道构造函数有没有返回呢?
构造函数时没有返回值的,赋值因为new关键字。
new的内部是调用了一个叫void * operator new(size_t size)的函数,operator new和malloc类似,他向系统申请一块空间,这块空间没有类型也没有被初始化,new在拿到这块空间后把这块空间类型化,初始化,也就是说在调用构造函数初始化之前这个对象就已经存在了,new在初始化完之后将这块空间的地址返回去了,并不是构造函数返回的。
当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:
class A
{
int i;
public:
A(int _i) :i(_i*_i) {}
void Say() { printf("i=%d\n", i); }
};
//调用new:
A* pa = new A(3);
那么上述动态创建一个对象的过程大致相当于以下三句话(只是大致上):
A* pa = (A*)malloc(sizeof(A));
pa->A::A(3);
return pa;
虽然从效果上看,这三句话也得到了一个有效的指向堆上的A对象的指针pa,但区别在于,当malloc失败时,它不会调用分配内存失败处理程序new_handler,而使用new的话会的。因此我们还是要尽可能的使用new,除非有一些特殊的需求。
构造方法是一种特殊的方法,具有以下特点。
(1)构造方法的方法名必须与类名相同。
(2)构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
(3)构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
(4)构造方法不能由编程人员调用,而要系统调用。
(5)一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构 造器,这个构造器不执行任何代码。
(6)构造方法可以重载,以参数的个数,类型,或排列顺序区分。
A a=new A;
A a=new A();
new 一个类或者结构体的话,实际上就是调用了他的无参数构造函数。
加上括号,指名了调用类的无参数的构造函数 ;括号内加参数的话,就是调用其他带参数的类的构造函数了。
带不带括号取决于类的构造函数。如果构造函数为有参数,那么new 后的括号中要有相应的参数。
如果是无参的构造函数,那么有无括号都行。总结就是()内有参数,则必须带。其他随意。