首页 > 编程语言 > 详细

C++基础之对象的关系

时间:2020-06-02 14:55:53      阅读:35      评论:0      收藏:0      [点我收藏+]

一、变量

1、变量和类的生命周期
变量的生存期是指变量所占据的内存空间由分配到释放的时期。变量有效的范围称为其作用域。全局变量是程序中定义在所有函数(包括main函数)之外的任何变量,其作用域
是程序从变量定义到整个程序结束的部分。这意味着全局变量可以被所有定义在全局变量之后的函数访问。全局变量及静态变量分配的空间在全局数据区,它们的生存期为整个程序的执行期间。
? 而局部变量,如在函数内或程序块内说明的变量,被分配到局部数据区,如栈区等。这种分配是临时的,一旦该函数体或程序块运行结束,所分配的空间就会被撤销。局部变量的生存期从被说明处开始,到所在程序块结束处结束。
? 对于静态变量,如果没有进行初始化,系统会自动初始化为0。局部变量如果没有进行初始化,则其值是不确定的。
? 使用new运算符创建的变量具有动态生存期。从声明处开始,直到用delete运算符释放存储空间或程序结束时,变量生存期结束。类的对象在生成时调用构造函数,在消亡时调用析构函数,在这两个函数调用之间即是对象的生存期。

2、在类中,也可以使用const关键字定义成员变量和成员函数,甚至是类的对象。由关键字const修饰的类成员变量称为类的常量成员变量。类的常量成员变量必须进行初始化,而且只能通过构造函数的成员初始化列表的方式进行。使用const修饰的函数称为常量函数。定义类的对象时如果在前面添加const关键字,则该对象称为常量对象。定义常量对象或常量成员变量的一般格式如下:
const 数据类型 常量名=表达式;
? 定义常量函数的格式如下:类型说明符 函数名(参数表)const;
? 在对象被创建以后,其常量成员变量的值就不允许被修改,只可以读取其值。对于常量对象,只能调用常量函数。总之,常量成员变量的值不能修改,常量对象中的各个属性值均不能修改。
? 不能通过常量对象调用普通成员函数 const Person person;person.getName();//错误的

 一、封闭类

当生成封闭类的对象并进行初始化时,它包含的成员对象也需要被初始化,需要调用成员对象的构造函数。在定义封闭类的构造函数时,需要添加初始化列表,指明要调用成员对象的哪个构造函数。在封闭类构造函数中添加初始化列表的格式如下:
封闭类名::构造函数名(参数表): 成员变量1(参数表),成员变量2(参数表),…{…}
初始化列表中的成员变量既可以是成员对象,也可以是基本数据类型的成员变量。对于成员对象,初始化列表的“参数表”中列出的是成员对象构造函数的参数(它指明了该成员对象如何初始化)。
先调用成员对象的构造函数,再调用封闭类对象的构造函数。

2、封闭类的复制构造函数
如果封闭类的对象是用默认复制构造函数初始化的,那么它包含的成员对象也会用复制构造函数初始化。

//成绩类
class Course{
    public:
        int id;
        string name;
        Course();
        Course(Course &course);
        Course(int id,string name);
};
Course::Course(Course &course){
    cout << "Course 复制构造函数" << endl;
    this->id=course.id;
    this->name=course.name;
}
Course::Course(int id,string name){
    this->id=id;
    this->name=name;
    cout << "Course 普通构造函数" << endl;
};
//学生类
class Student{
    public:
        int id;
        string name;
        //学生类中包含课程(Course),Student 称为封闭类
        Course course;
        Student(int id,string name,int cId,string cName);
        void show();   
};
Student::Student(int id,string name,int cId,string cName):id(id),name(name),course(cId,cName){
   cout << "Student 普通构造函数" << endl;
}
void Student::show(){
   cout << "name:"  << this->name  <<" course:" << this->course.name<< endl;
}
int main(){
    Student student(1,"小米",1,"数学");
    student.show();
    Student student2(2,"美团",1,"C++");
    student2.show();
}

 三、this指针

C++语言规定,当调用一个成员函数时,系统自动向它传递一个隐含的参数。该参数是一个指向调用该函数的对象的指针,称为this指针,从而使成员函数知道对哪个对象进行操作。
? C++规定,在非静态成员函数内部可以直接使用this关键字,this就代表指向该函数所作用的对象的指针。
? 在一般情况下,在不引起歧义时,可以省略“this->”,系统采用默认设置。
? 静态成员是类具有的属性,不是对象的特征,this表示的是隐藏的对象的指针,所以静态成员函数没有this指针。

void Person::setName(string name){
    this->name=name;
}
string Person::getName(){
    return this->name;
}
void Person::setId(int id){
    this->id=id;
}
int Person::getId(){
    return this->id;
}

 

C++基础之对象的关系

原文:https://www.cnblogs.com/jalja365/p/13029468.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!