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

#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 << "调用构造函数" << endl;
    // 为指针分配内存
    ptr = new int;
    *ptr = len;
}

Line::Line(const Line &obj)
{
    cout << "调用拷贝构造函数并为指针 ptr 分配内存" << endl;
    ptr = new int;
    *ptr = *obj.ptr; // 拷贝值
}

Line::~Line(void)
{
    cout << "释放内存" << endl;
    delete ptr;
}
int Line::getLength( void )
{
    return *ptr;
}

void display(Line obj)
{
   cout << "line 大小 : " << obj.getLength() <<endl;
}

// 程序的主函数
int main( )
{
   Line line(10);

   display(line);

   return 0;
}
//结果
调用构造函数
调用拷贝构造函数并为指针 ptr 分配内存
line 大小 : 10
释放内存
释放内存

1、类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。

#include <iostream>

using namespace std;

class Line
{
   public:
      void setLength( double len );
      double getLength( void );
      Line();  // 这是构造函数

   private:
      double length;
};

// 成员函数定义,包括构造函数
Line::Line(void)
{
    cout << "Object is being created" << endl;
}

void Line::setLength( double len )
{
    length = len;
}

double Line::getLength( void )
{
    return length;
}
// 程序的主函数
int main( )
{
   Line line;

   // 设置长度
   line.setLength(6.0);
   cout << "Length of line : " << line.getLength() <<endl;

   return 0;
}
//结果
Object is being created
Length of line : 6

#include <iostream>

using namespace std;

class Line
{
   public:
      void setLength( double len );
      double getLength( void );
      Line(double len);  // 这是构造函数

   private:
      double length;
};

// 成员函数定义,包括构造函数
Line::Line( double len)
{
    cout << "Object is being created, length = " << len << endl;
    length = len;
}

void Line::setLength( double len )
{
    length = len;
}

double Line::getLength( void )
{
    return length;
}
// 程序的主函数
int main( )
{
   Line line(10.0);

   // 获取默认设置的长度
   cout << "Length of line : " << line.getLength() <<endl;
   // 再次设置长度
   line.setLength(6.0);
   cout << "Length of line : " << line.getLength() <<endl;

   return 0;
}
//结果
Object is being created, length = 10
Length of line : 10
Length of line : 6

2、构造函数使用初始化列表来初始化字段

Line::Line( double len): length(len)
{
    cout << "Object is being created, length = " << len << endl;
}
//上面的语法等同于如下语法:
//在构造函数上对变量length进行赋值操作
Line::Line( double len)
{
    cout << "Object is being created, length = " << len << endl;
    length = len;
}

3、类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。

#include <iostream>

using namespace std;

class Line
{
   public:
      void setLength( double len );
      double getLength( void );
      Line();   // 这是构造函数声明
      ~Line();  // 这是析构函数声明

   private:
      double length;
};

// 成员函数定义,包括构造函数
Line::Line(void)
{
    cout << "Object is being created" << endl;
}
Line::~Line(void)
{
    cout << "Object is being deleted" << endl;
}

void Line::setLength( double len )
{
    length = len;
}

double Line::getLength( void )
{
    return length;
}
// 程序的主函数
int main( )
{
   Line line;

   // 设置长度
   line.setLength(6.0);
   cout << "Length of line : " << line.getLength() <<endl;

   return 0;
}

4、拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:

  • 通过使用另一个同类型的对象来初始化新创建的对象。
  • 复制对象把它作为参数传递给函数。
  • 复制对象,并从函数返回这个对象。

如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。拷贝构造函数的最常见形式如下:

原文地址:https://www.cnblogs.com/raorao1994/p/9063407.html

时间: 2024-11-29 09:13:39

构造函数、初始化列表来初始化字段、析构函数、拷贝构造函数的相关文章

为什么 没有缺省构造函数的类类型成员 必需要在初始化列表 里初始化 ?

名词解释 1.缺省构造函数:类的构造函数无参或参数默认值统称为缺省构造函数. 2.初始化列表:与其它函数不同,构造函数除了有名字,参数列表和函数体外还可以有初始化列表.列表以冒号开始后跟以逗号隔开的初始化字段.类成员是在构造函数的初始化列表创建好的,在创建类成员的同时,给成员变量一个初始化值. 在解释原因之前,需要了解构造函数是如何执行的 构造函数的执行过程 首先,构造函数的执行分为三步.先创建函数的形参(如果没有形参这步可以省略),然后执行初始化列表(即使没有初试化列表),最后执行函数体的内容

【转】构造函数中,成员变量一定要通过初始化列表来初始化的几种情况

1.类成员为const类型 2.类成员为引用类型 #include <iostream> using namespace std; class A { public: A(int &v) : i(v), p(v), j(v) {} void print_val() { cout << "hello:" << i << " " << j << endl; } private: const

只能在初始化列表中初始化的变量

1.const变量 有几个容易混淆的地方: (1)const 的变量只能通过构造函数的初始化列表进行初始化:(貌似在c++11中可以正常编译) (2)static 的变量只能通过在类外重新定义进行初始化: (3)static const 变量 只能通过在类中直接用”=”进行赋值. 2.引用 引用只能初始化,不能赋值 3.不含默认构造函数的类的对象 因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化. 构造函数的函数体内只能做赋值而不是初始化,因此初始化const对

【c++】必须在类初始化列表中初始化的几种情况

转自:http://www.cnblogs.com/kaituorensheng/p/3477630.html 1. 类成员为const类型 2. 类成员为引用类型 #include <iostream> using namespace std; class A { public: A(int &v) : i(v), p(v), j(v) {} void print_val() { cout << "hello:" << i <<

初始化列表来初始化

有一个类B继承子类,他们数据成员如下: class A{ ... private:   const int a; }; class B : public A{ ... private:   int a; public:   const int b;   A c;   static const char* d;   A& e; }; 则这些成员变量一定要通过A或者B的构造函数初始化列表来初始化的是( ) 解析:常量必须在初始化列表中初始化,否则,由于常量无法修改,在其他任何地方做为左值出现都将报错

c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数

每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数).对于任意一个类A,如果不编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: A(void);//缺省的无参数构造函数 A(const A&a);//缺省的拷贝构造函数 -A();//缺省的析构函数 A&operator=(const A &a);//缺省的赋值构造函数 1).“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘

c++中初始化列表的初始化变量顺序问题

例题来看:请问下面程序打印出的结果是什么? 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class base 7 { 8 private: 9 int m_i; 10 int m_j; 11 public: 12 base(int i):m_j(i),m_i(m_j); 13 base():m_j(0),m_i(m_j){} 14 int get_i() {return m_i;} 1

构造函数,哪些成员变量一定要通过初始化列表来初始化?

class A { ... private: int &a; }; class B : public A { ... private: int a; public: const int b; A c; static const char* d; A* e; }; 答案是  b  c 构造函数初始化时必须采用初始化列表一共有三种情况, 1.需要初始化的数据成员是对象(继承时调用基类构造函数)    这一点c符合 2.需要初始化const修饰的类成员                         

利用无名对象初始化对象系统不会调用拷贝构造函数

#include <iostream> using namespace std; class Internet { public: Internet(char *name,char *address) { cout<<"载入构造函数"<<endl; strcpy(Internet::name,name); } Internet(Internet &temp) { cout<<"载入COPY构造函数"<&l