1.类的设计
客观世界往往是复杂的,很多时候要描述一个物体,就需要将好几种类型组合在一起,为了解决这个问题,c语言提供了struct用来设计自己的类型。在c++中,类和结构体一样,也是一种自己设计的数据类型,与结构体不同的是,结构体大多只是数据成员,而类中除了数据成员,还有去操作数据成员的成员方法。
也就是说,类是数据成员与其方法的一个集合
class Student //
{
private:
int _id; //
protected:
int _snum; //
public:
//
};
class用来定义类,后面紧跟的是类名,类中的成员与方法有三个属性,分别是private(私有属性)protected(保护属性)和public(公有属性)。
在类的作用域外,不能够直接去访问类中的私有属性和保护属性。所以一般情况下,将类的数据成员定义为私有或保护,而对数据操作的函数(方法)定义为公有属性。
类的设计最关键的部分还是在于成员函数的设计,因为通过成员函数可以完成对私有或保护数据成员的操作。
类是一种数据类型,像int一样,在定义类的时候系统并不会给类分配空间,只有当类型实例化出对象后,才给对象分配空间。
2.对象的创建与使用
对象是类的实例,类在定义是系统并不分配内存空间,只有当类实例化出对象后,才为对象分配空间,因此,对象的创建与使用比较关键。
class Student
{
private:
int _id;
float _score;
public:
};
int main()
{
Student stu;
}
这样就很简单的创建出来一个对象。可以看到Student类型中有俩个数据成员,分别是学号和成绩,如果想给stu的学号和成绩赋值的话,就牵扯到构造函数了。
3.构造函数与析构函数
构造函数没有返回值,他的函数名是类名。构造函数有三个作用:
1.创建对象(其实上面的代码创建对象就是调用了系统给的默认的构造函数)
2.为对象做初始化(赋值)
3.类型转换
class Student
{
private:
int _id;
float _score;
public:
Student(int id,float score=0.0f):_id(id),_score(score)
{}
};
int main()
{
Student stu(2002,68.56);
}
构造函数的形参表中可以有缺省值。当定义对象的时候,系统会自动调用相匹配的构造函数来构建对象,冒号后面的是实例化表,对对象进行赋值。然后才会进入到函数体中。
对象的生存期内,只能被构建一次,也就是只会调用构造函数一次。
既然对象能被构建,肯定可以被销毁。当一个对象生存期结束后,系统会自动调用析构函数,用来销毁对象并且处理后续工作。
1.构函数名与类名相同,但在前面加上字符~,如: ~Student ()
2.析构函数无函数返回类型,与构造函数在这方面是一样的。但析构函数不带任何参数
3.一个类有一个也只有一个析构函数,这与构造函数不同。
4.对象注销时,系统自动调用析构函数
5.如果类说明中没有给出析构函数,则C++编译器自动给出一个缺省的析构函数、
析构的顺序是,先创建的对象最后被析构,和构造的顺序相反。
class Student
{
private:
int _id;
float _score;
public:
Student(int id,float score=0.0f):_id(id),_score(score)
{
cout << "Create Student" << endl;
}
~Student()
{
cout << "Destory Student" << endl;
}
};
int main()
{
Student stu(2002,68.56);
}
4.this指针
this指针是一个很重要的概念,如果我们创建了好几个对象:
class Student
{
private:
int _id;
float _score;
public:
Student(int id,float score=0.0f):_id(id),_score(score)
{
cout << "Create Student" << endl;
}
~Student()
{
cout << "Destory Student" << endl;
}
void Show_Student()
{
cout << "id: " << _id << " score: " << _score << endl;
}
};
int main()
{
Student stu(2002,68.56);
Student stu2(2023, 99.0);
Student stu3(2000, 40.00);
}
当这三个对象分别调用Show_Student的函数时,函数如何知道此时是哪个对象在调用它呢?
其实当对象调用普通方法或者析构函数或者构造函数的时候,会将自己的地址作为第一个参数传递进去,而函数这边用this指针接受。并且函数后可以加const用来限制函数内部不可以对this指针所指向的值进行修改。
class Student
{
private:
int _id;
float _score;
public:
Student(int id,float score=0.0f):_id(id),_score(score)
{
cout << "Create Student" << endl;
}
~Student()
{
cout << "Destory Student" << endl;
}
void Show_Student()const
{
cout << "id: " << _id << " score: " << _score << endl;
}
};
int main()
{
Student stu(2002,68.56);
Student stu2(2023, 99.0);
Student stu3(2000, 40.00);
stu2.Show_Student();
stu.Show_Student();
}
需要注意的是,静态函数与友元函数并没有this指针。
以上就是简单的类型设计与实例化对象
感谢阅读!