c++构造函数问题,初始化和赋值问题

默认构造函数(就是没有参数的构造函数)

The Default Constructor
The default constructor is the constructor used to create an object when you don‘t provide explicit initialization values. That is, it‘s the constructor used for declarations like this:

Stock stock1;  // uses the default constructor

1、由编译器自动生成

2、由我们自己定义的

这里又有两种情况

上面说了啊,default constructor有两种(……your own default constructor. This is a constructor that takes no arguments):
1)One is to provide default values for all the arguments to the existing constructor:
Stock(const char * co = "Error", int n = 0, double pr = 0.0);
2)The second is to use function overloading to define a second constructor, one that has no arguments:
Stock();
有一点注意的时候两者不能同时使用:
You can have only one default constructor, so be sure that you don‘t do both. (With early versions of C++, you could use only the second method for creating a default constructor.)
This is a constructor that takes no arguments:这个指的是调用的时候不带参数。

编译器自动添加默认构造函数的条件:编译器实现的构造函数其实就是什么都不做

1.没有任何自己定义的构造函数(即便是复制构造函数也不行,如果自己定义复制构造函数,则必须自己定义构造函数)

2、数据成员中没有const和reference。--因为要初始化。

拷贝构造函数的参数必须是引用的原因:拷贝构造函数的参数使用引用类型不是为了减少一次内存拷贝, 而是避免拷贝构造函数无限制的递归下去。

如果是值的话,那在传值的时候还要再调一次拷贝构造函数
然后又要传值,又要再调一次....
然后你就内存不够,当了

关于赋值==函数和拷贝构造函数的区别:

#include<iostream>
using namespace std;
class A
{ public:
int i;
A( const A& a)
{ i=a.i;
cout<<"copy is build"<<endl;
}
explicit A(int y)
{ i=y;
}
};
A fun(A i)
{ A a1(i);
  A a2=a1;//其实就调用拷贝构造函数
return a2;
}

int main()
{ A a(1);
fun(a);

}

拷贝构造函数一共调用四次拷贝构造函数。。fun参数传值一次,a1(i)一次,a2(a1)一次,return的时候构造临时对象一次

如果函数返回对象,而不是指针,那么在执行return的时候,会使用被return的对象“复制构造”临时对象,然后,return语句执行完毕(遇到分号;了)函数内部创建的全部变量析构、出栈。而被“赋值构造”的临时对象则在调用该函数的语句执行完毕(遇到分号;或者右边的大括号})后,析构。

总结一句:

临时变量的生存范围是语句级——分号;结束或者右边的大括号}结束。语句结束之后,临时变量就被析构了~

时间: 2025-01-02 04:06:43

c++构造函数问题,初始化和赋值问题的相关文章

c++类中对数据成员进行初始化和赋值的区别

在c++中定义一个类 ,对于构造函数 我们经常是这么写的: class test { public: test(int n_x , int n_y) { x = n_x; y = n_y; } private: int x , y; }; 这中写法虽然是合法的但比较草率 在构造函数 test(int n_x , int n_y)中 , 我们这样实际上不是对数据成员进行初始化 , 而是进行赋值. 正确的是初始化应该是这样的: class test { public: test() {} test(

C++ 初始化形式、变量初始化规则、类构造函数的初始化列表

类构造函数的初始化列表,举例 一个对象的构造分两部分,首先是分配空间,然后初始化. 只要有对象生成,不管是以什么形式生成,都会调用构造函数进行初始化. 然后下面有个例子,在蓝色区域Big类的复制构造函数中,使用初始化列表进行成员的初始化(方法1)没有问题,而如果不使用初始化列表.直接在函数里用里面注释掉的代码(方法2)则会报错:Base类没有合适的构造函数. // W3-课程作业2-4.cpp : Defines the entry point for the console applicati

c++构造函数 对象初始化

最近查看了关于c++构造函数的博客,为了防止关键知识的遗忘,特此记录一些要点,以便于今后的查阅. 如果不主动书写构造函数,c++或默认提供一般构造函数,拷贝构造函数以及复制运算符的操作.一般的构造函数没有任何参数,默认提供的该种构造函数不执行任何操作默认提供的拷贝构造函数简单的将成员变量赋值默认提供的复制运算也是简单的将成员变量赋值假设有类A,3种初始化方法在代码中表现如下A a();  一般的构造函数(带参数的一般构造函数可以视作对a的重载)A a(b);  拷贝构造函数A a = c; 赋值

C++学习笔记17,构造函数体内初始化数据成员与构造函数初始化器的区别(一)

在构造体内初始化数据成员是最常见的方法. 例如: #include <iostream> using namespace std; class A { private: int i; string s; public: A(int ii,string ss){ //在构造函数体内初始化数据成员 i=ii; s=ss; cout<<"ctor:i="<<i<<",s="<<s<<endl; } /

c++总结之类型,对象的定义和声明,对象的初始化和赋值

一.对象的类型 对象的类型决定了对象占用内存空间的大小,和内存的布局,内存中可存储值的范围以及对该对象可以进行的操作,由于对象的类型决定可以对其执行的操作,因此const属性也可以看做对象类型的组成部分.类型又分为静态类型和动态类型,对于普通对象,静态类型和动态类型一般是一致的:对于指针和引用类型,静态类型和动态类型可以相同也可以不同,静态类型是指针和引用定义时声明的类型,而动态类型是指程序运行时实际绑定的类型.当静态类型和动态类型不同时,一般来说有两种情况:一是指涉到常量的指针和引用绑定了一个

C++成员变量、构造函数的初始化顺序 [转]

C++成员变量.构造函数的初始化顺序 一.C++成员变量初始化 1.普通的变量:一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行 2.static 静态变量(本地化数据和代码范围): static变量属于类所有,而不属于类的对象,因此不管类被实例化了多少个对象,该变量都只有一个.在这种性质上理解,有点类似于全局变量的唯一性. 函数体内static变量的作用范围时该函数体,不同于auto变量,该变量内存只被分配一次,因此其值在下次调用时维持上次的值

构造函数、初始化列表来初始化字段、析构函数、拷贝构造函数

#include <iostream> using namespace std; class Line { public: int getLength( void ); Line( int len ); // 简单的构造函数 Line( const Line &obj); // 拷贝构造函数 ~Line(); // 析构函数 private: int *ptr; }; // 成员函数定义,包括构造函数 Line::Line(int len) { cout << "

【校招面试 之 C++】第1题 为什么优先使用构造函数的初始化列表

1.首先看一个例子: #include<iostream> using namespace std; class Test1 { public: Test1() // 无参构造函数 { cout << "Construct Test1" << endl ; } Test1(const Test1& t1) // 拷贝构造函数 { cout << "Copy constructor for Test1" <

类的构造函数、析构函数与赋值函数

构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易 麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险. 每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝 构造函数,其它的称为普通构造函数).对于任意一个类 A,如果不想编写上述函数, C++编译器将自动为 A 产生四个缺省的函数. 1 #include <iostream> 2 3 /* run this program using the console pauser or add y

构造函数和初始化列表

区别: 对于在函数体中(构造函数)初始化,是在所有的数据成员被分配内存空间后才进行的. 列表初始化是给数据成员分配内存空间时就进行初始化,就是说分配一个数据成员只要冒号后有此数据成员的赋值表达式(此表达式必须是括号赋值表达式),那么分配了内存空间后在进入函数体之前给数据成员赋值,就是说初始化这个数据成员此时函数体还未执行. 在我们使用初始化列表进行初始化时,它是关于C++初始化类成员的.它们是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序. 三种类型必须通过初始化列表来初始化  常量