首页 > 编程语言 >C++类和对象

C++类和对象

时间:2024-02-04 23:23:33浏览次数:40  
标签:对象 age C++ Person int private public 构造函数

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};

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

    

标签:对象,age,C++,Person,int,private,public,构造函数
From: https://www.cnblogs.com/pape/p/18007119

相关文章

  • 面向对象编程
    面向对象编程Java的核心思想就是OOP1、初识面向对象面向过程&面向对象面向过程思想步骤清晰简单,第一步做什么,第二步做什么……面向过程适合处理一些较为简单的问题面向对象思想物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单......
  • C++CLI 析构函数和终结器理解
    测试类:#pragmaoncerefclassHello{public:Hello();~Hello();!Hello();};/***************/#include"Hello.h"Hello::Hello(){System::Console::WriteLine("构造函数!");}Hello::~Hello(){System::Console::WriteLi......
  • C++ Primer 学习笔记 PartI C++基础
    Ch1开始略这一章包含控制流,条件,循环,注释,标准IO等内容。对于C语言/ACMC+STL中常见数值的内容不再赘述,仅总结较为不熟悉的内容。PartIC++基础CH2变量和基本类型2.1基本内置类型2.1.1算术类型2.1.1类型转换向unsigned赋超出范围的值,结果取余,对于signed,结果未定义。......
  • cloudreve中的通用返回对象的处理
    cloudreve中的通用返回对象的处理包名:serializer基础化的响应结构体//Response基础序列化器typeResponsestruct{Codeint`json:"code"`Datainterface{}`json:"data,omitempty"`Msgstring`json:"msg"`Error......
  • C++中promise和future初认识
    future/promisefuture提供了一个基于数据(future模板类型)的异步概念:对于一个类型T,可以在以后通过get接口获得这个类型T的变量。或者打个不太恰当的比方,当你获得一个future对象时,就获得了一个消费券(consumer):拿着这张券可以兑换(get)一个T类型的结果(如果数据未就绪的话会阻塞等......
  • C++多线程 第三章 在线程间共享数据
    第三章在线程间共享数据共享数据基本问题如果所有共享数据都只读,那就没有问题.不变量(invariants):对特定数据结构总为真的语句.例如:"该变量表示线程数量."修改线程之间共享数据的一个常见潜在问题就是破坏不变量.竞争条件(racecondition):线程竞争执行各自的操作,导......
  • C++之INI配置文件读写/注释库 inicpp 介绍【简单易用-包含inicpp.hpp头文件即可】
    一个头文件(header-file-only)搞定INI文件读写、甚至进行注释。跨平台,并且用法极其简单。MITlicense,从此配置INI文件就像喝水。【注:对您有帮助的话,Star或Issues为项目维护提供动力,感谢。】-byofficalofJN-inicppproject.一、库下载https://github.com/dujingning/inicpp......
  • 12 - 变量与对象与object, type, class
    变量与对象参考资料:菜鸟教程:Python3基本数据类型Python文档:数据模型-对象、值与类型RealPython:Python中的变量与对象知乎:如何理解python中一切皆对象呢?看type,object,class的关系变量(variable)的赋值(assignment)与删除(deletion)Python中的变量不需要声明。每个变量在......
  • 14. C++函数的编译
    C++函数的编译C++和C语言的编译方式不同。C语言中的函数在编译时名字不变,或者只是简单的加一个下划线_(不同的编译器有不同的实现),例如,func()编译后为func()或_func()。而C++中的函数在编译时会根据它所在的命名空间、它所属的类、以及它的参数列表(也叫参数签名)等信息进行重新......
  • 创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现
      本文介绍基于C++语言GDAL库,批量创建大量栅格遥感影像文件,并将数据批量写入其中的方法。  首先,我们来明确一下本文所需实现的需求。已知我们对大量遥感影像进行了批量读取与数据处理操作——具体过程可以参考文章C++GDAL提取多时相遥感影像中像素随时间变化的数值数组;而随......