String str = new String("content") 构造函数有没有返回值?new关键字到底在对象初始化中做了什么?

看到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 后的括号中要有相应的参数。
如果是无参的构造函数,那么有无括号都行。总结就是()内有参数,则必须带。其他随意。

猜你喜欢

转载自blog.csdn.net/weixin_40539125/article/details/84287813