// test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <string> using namespace std; class Student { public: //1.无参数的构造函数,可以使用 Student stu;创建对象,则num=1;name="lucky";sex='f'; /* Student() { num=1; name="lucky"; sex='f'; } */ //2.有参数的构造函数,并有初始值,如下,可以用如下形式创建对象 //如Student stu;则默认为num=1;name="stu1";sex='f' //如Student stu(2,"stu2",'m');则num=2;name="stu2";sex='m' /* Student(int nu=1,string na="stu1",char se='f') { num=nu; name=na; sex=se; } */ //3.使用参数初始化列表,同2.效果一样,使用方法也一样,但比较简便直观 Student(int nu=1,string na="stu1",char se='f'):num(nu),name(na),sex(se){} void display() { cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl; } private: int num; string name; char sex; }; int main(int argc, char* argv[]) { Student stu1; stu1.display(); Student stu2(2,"stu2",'m'); stu2.display(); return 0; }执行效果
num:1 name:stu1 sex:f num:2 name:stu2 sex:m Press any key to continue
注意:
1.如果类中一个构造函数也没有显式定义,则可以使用Student stu;形式创建对像。创建对象时调用的是系统默认的一个无参构造函数,该函数什么也不做。,
2.如果类中有构造函数显式定义,则系统默认的构造函数失效。
所以,如果类中只定义了一个带参数的构造函数并且没有指定初始值,如Student(int nu,string na,char se) ,则只能使用如Student stu(2,"stu2",'m')的形式创建对象,不能使用Student stu;创建对象(因为默认无参数的构造函数已经失效,无法调用)。但可以用3.解决。
3.如果类中只定义了一个带参数的构造函数并且指定了初始值,比如Student(int nu=1,string na="stu1",char se='f');,则可以使用Student stu(2,"stu2",'m')创建对象,也可使用Student stu;创建对象(调用的是自定义的构造函数,并使用初始值)。
4.无参数创建对象时是Student stu;不要写成Student stu()--这是声明一个普通函数stu(),函数返回值是Student 类型。--p75 c++面向对象程序设计
5.构造函数的重载:在一个类中可以定义多个构造函数.以便对类对象提供不同的初始化的方法!供用户选用" 这些构造函数具有相同的名字!而参数的个数或参数的类型不相同" 这称为构造函数的重载"--p73 c++面向对象程序设计
6.C++用new运算符动态地分配内存,用 delete运算符释放这些内存空间.这也适用于对象.可以用new 运算符动态建立对象,用delete运算符撤销对象(静态是指在程序运行过程中,对象所占的空间是不能随时释放的。例如在一个函数中定义了一个对象,只有在该函数结束时,该对象才释放)--p96 c++面向对象程序设计
比如对于函数构造函数是Student(int nu=1,string na="stu1",char se='f');的类Student,可以如下动态为对象(开辟内存)
Student *pstu=new Student; //无参数动态创建一个对象,并返回对象在内存区的首地址,赋给pstu。调用的是上面那个自定义构造函数,并使用默认参数。
Student *pstu=new Student(3,"stu3",'m') ;//带参数动态创建,调用的是自定义构造函数。
动态创建new Student的格式跟静态创建Student stu的格式一样,所以无参数创建一个对象时用Student stu;不能写成Student stu(),但new Student可写成new Student()
用new建立的动态对象一般是不用对象名的,而是用指向该对象内存区的指针,去访问该对象,如pstu->display()。
/****************************************************************************************************************************************/