C++类和对象

1.类和对象

  1.1 声明类

class Person{
private:
   string name;
   int age;  
};

  1.2 作为类实例的对象

  1.3 使用句点运算符访问成员

  1.4 使用指针运算符(->)访问成员

2.关键字public与private

3.构造函数

  3.1 构造函数重载

  3.2 默认构造函数:只要不需要参数构造对象,就是默认构造函数,默认构造函数不一定没有一个形参。

4.析构函数

5.复制构造函数

  5.1 浅拷贝:只复制指针的指,使得两个指针指向同一块内存。

  5.2 复制构造函数为什么必须是引用:实参传给形参需要调用复制构造函数,用引用是为了防止复制构造函数反复调用自身,最后栈溢出。

6.移动构造函数

  6.1 防止对临时对象的拷贝,将移动对象的内部数据“窃取”过来。

  

class MyString{
private:
   char* buffer; 
public:
   MyString(MyString&& str)
   {
      buffer = str.buffer;
      str.buffer = nullptr;
   } 
};

7.构造函数和析构函数的其他用途

  7.1 不允许复制的类:将复制构造函数声明为私有的。

  7.2 只能有一个实例的类:将构造函数、复制构造函数、赋值运算符定义为私有的。定义一个静态函数用于创建返回唯一的对象、

  

class President{
private:
   President(){}
   President(const President& other) ;
   President& operator=(const President& other);
public:
    static President& GetInstance()
    {
          static President pre;
          return pre;
    }
};

  7.3 禁止在栈中定义对象:类中的数据庞大,必须创建在堆区。做法:将析构函数定义为私有的,这样在栈中定义对象将报错,必须定义成T* ptr = new T();

  7.4 类构造函数的类型转换。只要能用一个参数构造一个类,就具有隐式转换的能力。

  

class Person{
private:
    int age;
    string name;
public:
    Person(int age=10,name = "xxx")
   {
   }
};


void DoSomething(Person p)
{
}


int main()
{
    Person p(10);  
    DoSomething(10);
}

     编译器知道Person 类包含了一个将整数作为参数的构造函数,当向DoSomething传整数时,编译器将这个整数传给构造函数,进而构造对象。

     使用explicit可避免隐式转换。

 

8. this指针

  记录对象地址。

9. sizeof用于类

  大小与结构体字节对齐规则有关。

10.结构不用于类的地方

  默认访问属性:类是private、结构是public

       默认继承方式:类是private、结构是public

11.声明友元:

  11.1友元函数:

    

class Person{
private:
  friend void Display(Person& P);
  int age;
public:
  Person(int age):age(age){}  
}

void Display(Person& p)
{
  cout<<p.age<<endl;  
}


int main()
{
  Person p;
  Display(p);
}

 

  11.2 友元类:

 

class Person{
private:
  friend class Utility;
  int age;
public:
  Person(int age):age(age){}  
}

class Utility
{
public:
  void Display(Person& p)
  {
    cout<<p.age<<endl;
  }  
};

int main()
{
  Person p;
  Utility::Display(p);
}

 

 12.共用体

  共用体内部成员共用一块内存,内存大小由最大成员决定。

      一种共用体使用场景。

struct ComplexType
{
   enum DataType
   {
     Int,
     Char
   }Type; 

   union Value
   {
      int num;
      char alpha;
      Value(){}
      ~Value(){}
    };
};    

 

 

13.对类和结构使用聚合初始化

  Type ObjectName = {arg1,arg2,....,argN};

   类满足聚合初始化的条件:只包含公有和非静态私有成员,而不包含私有或受保护的数据成员;不包含任何虚函数、只涉及公有继承,不包含用户自定义的构造函数。

    

posted @ 2024-02-04 23:14  两只萤火虫  阅读(41)  评论(0)    收藏  举报