C++学习笔记_6_ 类的成员函数-构造函数

构造函数

对应的析构函数

1.概念

对于以下的日期类,可以通过SetDate公有的方法给对象设置内容。但每次创建对象都调用该方法过于麻烦。
构造函数在对象创建时,就完成了初始化

class Date
{
    
     
public:
 void SetDate(int year, int month, int day)
 {
    
    
 _year = year;
 _month = month;
 _day = day;
 }
 
 void Display()
 {
    
    
 cout <<_year<< "-" <<_month << "-"<< _day <<endl;
 }
private:
 int _year;
 int _month;
 int _day;
};
int main()
{
    
    
 Date d1,d2;
 d1.SetDate(2021,5,1);
 d1.Display();
 
 Date d2;
 d2.SetDate(2021,7,1);
 d2.Display();
 return 0; }

构造函数是一个特殊成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次。

1.2特性

构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主要任务并不是开空间创建对象,而是初始化对象

特性如下:

  1. 函数名类名相同。
  2. 无返回值。
  3. 对象实例化时编译器自动调用对应的构造函数。
  4. 构造函数重载
class Date
{
    
    
public :
 // 1.无参构造函数
 Date ()
 {
    
    }
 
 // 2.带参构造函数
 Date (int year, int month , int day )
 {
    
    
 _year = year ;
 _month = month ;
 _day = day ;
 }
private :
 int _year ;
 int _month ;
 int _day ;
};
void TestDate()
{
    
    
 Date d1; // 调用无参构造函数
 Date d2 (2015, 1, 1); // 调用带参的构造函数
 
 // 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明
 // 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象
 Date d3(); 
}
  1. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成:
class Date
{
    
    
public:
 /*
 // 如果用户显式定义了构造函数,编译器将不再生成
 Date (int year, int month, int day)
 {
 _year = year;
 _month = month;
 _day = day;
 }
 */
private:
 int _year;
 int _month;
 int _day;
};
void Test()
{
    
    
 // 没有定义构造函数,对象也可以创建成功,因此此处调用的是编译器生成的默认构造函数
  Date d; 
}
  1. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数:
// 默认构造函数
class Date
{
    
     
public:
 Date()
 {
    
    
 _year = 1900 ;
 _month = 1 ;
 _day = 1;
 }
 
 Date (int year = 1900, int month = 1, int day = 1)
 {
    
    
 _year = year;
 _month = month;
 _day = day;
 }
private :
 int _year ;
 int _month ;
 int _day ;
};
// 以下测试函数能通过编译吗?
void Test()
{
    
    
 Date d1; }
  1. 关于编译器生成的默认成员函数,很多童鞋会有疑惑:在我们不实现构造函数的情况下,编译器会生成默认的构造函数。但是看起来默认构造函数又没什么用?d对象调用了编译器生成的默认构造函数,但是d对象year/month/_day,依旧是随机值。
  2. 成员变量的命名风格:
// 我们看看这个函数,是不是很僵硬?
class Date
{
    
    
public:
 Date(int year)
 {
    
    
 // 这里的year到底是成员变量,还是函数形参?
 year = year;
 }
private:
 int year;
};
// 所以我们一般都建议这样
class Date
{
    
    
public:
 Date(int year)
 {
    
    
 _year = year;
 }
 private:
 int _year;
};
// 或者这样。
class Date
{
    
    
public:
 Date(int year)
 {
    
    
 m_year = year;
 }
private:
 int m_year;
};

猜你喜欢

转载自blog.csdn.net/kris_paul/article/details/115335989