c++(六)

 c++面向对象的三大特性:封装、继承、多态

c++认为万事万物都皆为对象,对象上有其属性和行为

 

 类的属性和行为,我们统一称为 成员

属性也叫成员属性或成员变量

行为也叫成员函数或者成员方法

public      成员 在类内可以访问到,在类外也可以访问到

protected 成员 在类内可以访问到,在类外不可以访问到 儿子可以访问父亲中的保护内容

 private    成员  在类内可以访问到,在类外不可以访问到 儿子不可以访问父亲的私有内容

class Person{

public:  

     string m_Name;

protected:

      string  m_Car;

private:

       int   m_Password;

public:

       void func()

                 {

                       m_Name="张三";

                       m_Car=“拖拉机”;

                       m_Password=123456;(类内都可以访问)

                 }

};

int  main()

{

    Person p1;

    p1.m_Name="李四";   

    p1.m_Car="宝马";    (报错)

}

struct和class的区别

在c++中struct和class的唯一区别就在于默认的访问权限不同,struct默认权限为公共,二class默认权限为私有

 

对于写 可以检测数据的有效性

 利用成员函数判断两个立方体是否相等

如果主函数中调用成员函数判断的话,先有一个对象调用这个函数才可以,那么在class的成员函数中设置bool  isSameByClass(Club &c)只需要一个形参 { if(m_L==c.getL()  && m_W== c.getW()  &&  m_H==c.getH() )  { return true;} return false;}

 

构造函数和析构函数

构造函数和析构函数将会被编译器自动调用,完成对象初始化和清理工作。

对象的初始化和清理工作是编译器强制要我们做的事情,如果我们不提供构造函数和析构函数,编译器会提供,编译器提供的构造和析构函数是空实现。

构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用

析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作

 

构造函数语法:类名(){}

1.构造函数,没有返回值也不写void

2.函数名称与类名相同   

3.构造函数可以有参数,因此可以发生重载

4.程序在调用对象时候会自动调用构造,无需手动,而且只会调用一次

 析构函数语法:~类名(){}

1.析构函数,没有返回值也不写void

2.函数名称与类名相同,在名称前加上符号~

3.析构函数不可以有参数,因此不可以发生重载

4.程序在对象销毁前会自动调用析构,无需手动,而且只会调用一次

 

构造函数的两种分类方式:

  按参数分为:有参构造和无参构造

  按类型分为:普通构造和拷贝构造

三种调用方式:

   括号法

   显示法

   隐式转换法

//拷贝构造函数
Person(const Person &p )//加const是因为不能把本身修改掉,拷贝的同时要用引用的方式传进去
{
//将传入的人身上的所有属性,拷贝到我身上
age = p.age;
cout << "拷贝构造函数的调用" << endl;
}

void test01()
{
Person p;//调用对象时自动调用构造函数,等到test01()执行结束之后,释放这个对象;(默认构造函数的调用,不要加小括号())
//括号法
Person p2(10);//有参构造函数的调用
Person p3(p2);//括号法调用拷贝构造函数


//显示法
Person p4;//默认构造函数
Person p5 = Person(10);//有参构造函数
Person p6 = Person(p5);//拷贝构造函数

Person(10);//匿名对象,单独拿出来没有名字,上方的p5是它的名字
//特点:当前行执行结束后,系统会立即回收掉匿名对象
//不要利用拷贝构造函数 初始化匿名对象 Person(p3);这样是不对的,编译器会认为是对象声明


//隐式转化法
Person p7 = 10;//相当于 写了 Person p4 = Person(10);
Person p5 = p4;//拷贝构造
}

 

拷贝构造函数调用时机

1. 使用一个已经创建完毕的对象来初始化一个新对象 Person p2(p1);

2.值传递的方式给函数参数传值,值传递相当于Person p=p 是拷贝构造函数的隐式写法 :  void  doWork(Person p)  { }    void test01(){ Person p; doWork(p)};       

3.值方式返回局部对象Person doWok2() {Person p1; return p1;}  void test03(){ Person p=doWork2()}调用了拷贝构造函数,实际上不会返回p1.拷贝p1返回新对象

 

posted @ 2022-06-18 09:54  小小是  阅读(48)  评论(0)    收藏  举报