类(2)

类的种类 
局部对象:栈区 
class Cperson
{  
public:string name; 
private:int age; 
protected:bool sex;  
public: 
Cperson()//没有参数的构造函数
{   name="leilei";
   age=0;
  sex=1;
}
Cperson(string name1,int age1,bool sex1)//有参数的构造函数
{    name=name1;
     age=age1;
     sex=sex1;
}

int getage()

{
return age;//得到年龄的接口函数如果我们在类外想要访问类内的私有的或受保护的成员变量就要调用接口函数
}
bool getsex()
{
return sex;
}
void setage(int age1)//调用接口函数间接给类的成员变量赋值
{
age=age1;
}
};

int getage()

{
return age;//得到年龄的接口函数如果我们在类外想要访问类内的私有的或受保护的成员变量就要调用接口函数
}
bool getsex()
{
return sex;
}
void setage(int age1)//调用接口函数间接给类的成员变量赋值
{
age=age1;
}
};
int main(){
{Cperson pp;

}// 作用域结束调用析构函数
return 0;

}   
全局对象
class Cperson
{  
public:string name; 
private:int age; 
protected:bool sex;  
public: 
Cperson()//没有参数的构造函数
{   name="leilei";
   age=0;
  sex=1;
}
Cperson(string name1,int age1,bool sex1)//有参数的构造函数
{    name=name1;
     age=age1;
     sex=sex1;
}

int getage()

{
return age;//得到年龄的接口函数如果我们在类外想要访问类内的私有的或受保护的成员变量就要调用接口函数
}
bool getsex()
{
return sex;
}
void setage(int age1)//调用接口函数间接给类的成员变量赋值
{
age=age1;
}
};

int getage()

{
return age;//得到年龄的接口函数如果我们在类外想要访问类内的私有的或受保护的成员变量就要调用接口函数
}
bool getsex()
{
return sex;
}
void setage(int age1)//调用接口函数间接给类的成员变量赋值
{
age=age1;
}
};
Cperson pp;// 定义全局对象 在整个程序结束后调用析构

int main(){
}  
在堆区new的对象  
int main(){  
{  Cperson *ps=new Cperson;//没有析构需要手动释放
}  
return 0;
临时对象  
int main()
{  Cperson();//生命周期在当前行 当前行结束后对象被回收
}   
如何选择哪一类对象 
看生命周期  是否由用户控制如果是就用new  是否程序从运行到结束一直存在  要用全局或static

类中的普通变量定义对象的时候就存在  类中的函数在编译的时候就放在代码段只有一份 
const    const修饰的变量不能更改(常量) 
若类中装有带const修饰的成员   class Cperson{  public:  const int num;//const修饰的变量一定要在定义的时候初始化那么就                                                                                                               //一定要在类的 初始化类表中初始化
public: Cperson():num(123)// 初始化列表
{
}// 调用构造函数的时候先执行初始化类表再执行构造函数内的内容
常量一定要在初始化列表中初始化 还有另一种情况一定要在初始化列表中定义 在一个类中定义了另一个类的成员变量 而另一个类中定义了带有参数的构造函数 

在类中应该注意的小知识点 
const 
const修饰的变量不能更改   const int *p=#//这里的*p不能更改 而p可以更改 
若类中成员变量有const修饰的 那么是需要初始化的可是在类中不能给成员变量初始化这时就需要引入初始化成员列表 
class Cperson
{  public:
        const int num; 
public: Cperson():num(123)//初始化成员列表先执行初始化成员列表在执行构造函数若有多个成员变量需要初始化则用逗号隔
       {

          }
有两种情况一定要使用初始化成员列表  第一种情况就如上述所说明的第二种情况 若是一个类中成员变量是另一个类的对象 而这个只有带有参数的构造函数这时就必须在初始化成员类表中初始化对象
常函数  类中的成员函数用const修饰的为常函数
void show()  const//常函数不能修改类中的成员变量   在类中函数的参数都有一个系统默认的本类型的this指针 常函数的指针实                              //际上是    const Cperson * this  这代表*this 不能更改 而this 可以更改
{
}

继承  
类之间的纵向关系  
class Csuperman :public Cperson   //Csuperman 继承Cperson public 代表继承的方式

继承是把父类中的所有成员都继承过来 继承是为了提高复用性  若子类和父类同时出现相同的成员变量 那么我们就用作用域运算符来区分
public private protected 继承方式之间的区别  无论哪种继承方式一定是继承过来父类中所有的成员变量

class Cson: public Cfather   //继承过来的成员变量跟父类的访问修饰符相同但是父类中私有的在这里是不可访问的

calss Cson:protected Cfather //继承过来的父类成员变量  public->protected    protected保持不变  private->不可访问的

class Cson :private Cfather // private->不可访问的    public、protected->private
自己的类中不能调用自己的对象但是可以调用只想本类的指针   因为在自己类中定义自己的对象 这个类还没定义完所以不知道应该分配多大的空间  若定义指向本类的指针就可以因为指针就分配4个字节大小的空间
继承关系中 构造函数和析构函数调用的顺序    构造  从上到下   从父类到子类     析构  从下到上  从子类到父类

猜你喜欢

转载自blog.csdn.net/qq_37163944/article/details/80465066