#include <iostream> using namespace std; class Student{ private: char *m_name; int m_age; float m_score; public: //声明构造函数 Student(char *name, int age, float score); //声明普通成员函数 void show(); }; //定义构造函数 Student::Student(char *name, int age, float score){ m_name = name; m_age = age; m_score = score; } //定义普通成员函数 void Student::show(){ cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl; } int main(){ //创建对象时向构造函数传参 Student stu("小明", 15, 92.5f); stu.show(); //创建对象时向构造函数传参 Student *pstu = new Student("李华", 16, 96); pstu -> show(); return 0; }运行结果:
Student(char *, int, float)
,它的作用是给三个 private 属性的成员变量赋值。要想调用该构造函数,就得在创建对象的同时传递实参,并且实参由( )
包围,和普通的函数调用非常类似。Student stu("小明", 15, 92.5f)
;在堆上创建对象时,实参位于类名后面,例如new Student("李华", 16, 96)
。Student stu
或者new Student
就是错误的,因为类中包含了构造函数,而创建对象时却没有调用。#include <iostream> using namespace std; class Student{ private: char *m_name; int m_age; float m_score; public: Student(); Student(char *name, int age, float score); void setname(char *name); void setage(int age); void setscore(float score); void show(); }; Student::Student(){ m_name = NULL; m_age = 0; m_score = 0.0; } Student::Student(char *name, int age, float score){ m_name = name; m_age = age; m_score = score; } void Student::setname(char *name){ m_name = name; } void Student::setage(int age){ m_age = age; } void Student::setscore(float score){ m_score = score; } void Student::show(){ if(m_name == NULL || m_age <= 0){ cout<<"成员变量还未初始化"<<endl; }else{ cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl; } } int main(){ //调用构造函数 Student(char *, int, float) Student stu("小明", 15, 92.5f); stu.show(); //调用构造函数 Student() Student *pstu = new Student(); pstu -> show(); pstu -> setname("李华"); pstu -> setage(16); pstu -> setscore(96); pstu -> show(); return 0; }运行结果:
Student(char *, int, float)
为各个成员变量赋值,构造函数Student()
将各个成员变量的值设置为空,它们是重载关系。根据Student()
创建对象时不会赋予成员变量有效值,所以还要调用成员函数 setname()、setage()、setscore() 来给它们重新赋值。Student(){}一个类必须有构造函数,要么用户自己定义,要么编译器自动生成。一旦用户自己定义了构造函数,不管有几个,也不管形参如何,编译器都不再自动生成。在示例1中,Student 类已经有了一个构造函数
Student(char *, int, float)
,也就是我们自己定义的,编译器不会再额外添加构造函数Student()
,在示例2中我们才手动添加了该构造函数。
最后需要注意的一点是,调用没有参数的构造函数也可以省略括号。对于示例2的代码,在栈上创建对象可以写作Student stu()
或Student stu
,在堆上创建对象可以写作Student *pstu = new Student()
或Student *pstu = new Student
,它们都会调用构造函数 Student()。
本文链接:http://task.lmcjl.com/news/8445.html