两个类,在一个类中私有成员建立另一个类的对象,在其构造函数怎么初始化另一个类的对象(需要对其私有成员进行初始化)
如下:在Student类中建立Birth的对象,在Student的构造函数中需要对Birth的私有成员进行初始化:
class Birthday
{
private:
int m_year;
int m_month;
int m_day;
public:
Birthday(int y,int m,int d);
void print();
~Birthday();
};
class Student
{
private:
Test m_t;
Birthday m_birth;
char m_name[10];
const int m_age;
public:
Student(char *n,int y,int m,int d);
void print();
~Student();
};
那我们怎么去解决这个办法呢?
可以书写一个构造函数:
Student::Student(char *n,int y,int m,int d):m_birth(y,m,d),m_age(20)
{
cout << "Student construct" << endl;
strcpy(m_name,n);
}
这样即可实现其初始化
这种方法叫做 对象初始化列表
1)对象初始化列表出现原因
1.必须这样做:
如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数。这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,
如果没有初始化列表,那么他将无法完成第一步,就会报错。
2、类成员中若有const修饰,必须在对象初始化的时候,给const int m 赋值
当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,
因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的。
1)当类中有成员变量是其它类的对象时,首先调用成员变量的构造函数,调用顺序与声明顺序相同;之后调用自身类的构造函数
2)析构函数的调用顺序与对应的构造函数调用顺序相反
加入Test是一个类(已经书写了构造函数),可以这样子创立对象
Test(1,2);
Test t1(2,3);
Test t2(3,4);
cout << "*****" << endl;
Test t3 = Test(3,4);
cout << "*********" << endl;
Test t4(1);
t4.Print();
New与delete
1)在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。
注意: new和delete是运算符,不是函数,因此执行效率高。
2)虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符。new运算符的例子:
new int; //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)
new int(100); //开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址
new char[10]; //开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址
new int[5][4]; //开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址
float *p=new float (3.14159); //开辟一个存放单精度数的空间,并指定该实数的初值为//3.14159,将返回的该空间的地址赋给指针变量p
3)new和delete运算符使用的一般格式为:
用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。
用C++实现链表存储学生信息,用尾插法实现插入:
为了代码规范,选择书写 多个.cpp .h文件
main.cpp mylist.cpp mylist.h student.cpp student.h
student.h
#ifndef _STUDENT_H_
#define _STUDENT_H_
class Student
{
private:
char m_name[10];
int m_age;
char m_sex;
Student *m_next;
public:
Student(char *a = "xxx",int b = 20,char c = 'm');
void print();
void SetNext(Student *s);
Student *GetNext();
};
#endif
Student.cpp
#include <iostream>
#include "student.h"
#include <string.h>
#include <stdlib.h>
using namespace std;
Student::Student(char *a,int b,char c)
{
m_age = b;
m_sex = c;
strcpy(m_name,a);
m_next = NULL;
}
void Student::print()
{
cout << "m_name :" << m_name << endl;
cout << "m_age :" << m_age << endl;
cout << "m_sex :" << m_sex << endl;
}
void Student::SetNext(Student *s) //设置下一个结点
{
m_next = s;
}
Student* Student::GetNext() //得到下一个结点
{
return m_next;
}
mylist.h
#ifndef _MYLIST_H_
#define _MYLIST_H_
#include "student.h"
class Mylist
{
private:
Student *m_first;
public:
void push_back(Student *s);
void traveser();
void remove(Student *s);
Mylist();
};
#endif
mylist.cpp
#include <iostream>
#include "mylist.h"
#include <stdlib.h>
using namespace std;
Mylist::Mylist()
{
m_first = new Student;
if(NULL == m_first)
{
cout << "new failure" << endl;
}
}
void Mylist::push_back(Student *s) //尾插法
{
Student *p = m_first;
while(p->GetNext() != NULL)
{
p = p->GetNext();
}
p->SetNext(s);
}
void Mylist::traveser() //遍历
{
Student *p = m_first;
while(p->GetNext() != NULL)
{
p = p->GetNext();
p->print();
}
}
void Mylist::remove(Student *s)
{
Student *p = m_first;
while(p->GetNext() != s)
{
p = p->GetNext();
if(p->GetNext() == NULL)
{
cout << "error" << endl;
}
}
//Student *tmp;
p->SetNext(p->GetNext()->GetNext());
//p->GetNext() = tmp;
}
main.cpp
#include <iostream>
#include "mylist.h"
using namespace std;
int main()
{
Mylist mylist;
Student *s1 = new Student("aa",120,'m');
Student *s2 = new Student("bb",220,'f');
Student *s3 = new Student("cc",320,'m');
Student *s4 = new Student("dd",420,'f');
Student *s5 = new Student("ee",520,'m');
mylist.push_back(s1);
mylist.push_back(s2);
mylist.push_back(s3);
mylist.push_back(s4);
mylist.push_back(s5);
mylist.traveser();
mylist.remove(s2);
mylist.traveser();
return 0;
}
运行结果:
m_name :aa
m_age :120
m_sex :m
m_name :bb
m_age :220
m_sex :f
m_name :cc
m_age :320
m_sex :m
m_name :dd
m_age :420
m_sex :f
m_name :ee
m_age :520
m_sex :m
m_name :aa
m_age :120
m_sex :m
m_name :cc
m_age :320
m_sex :m
m_name :dd
m_age :420
m_sex :f
m_name :ee
m_age :520
m_sex :m