C++ 类 class的一系列问题

本文深入探讨了C++中的类,包括类的定义、数据成员的访问、对象创建、成员函数(包括构造函数和析构函数)、引用、复制构造函数、静态成员和运算符重载。此外,还介绍了友元函数和静态成员的功能和用法,以及在类设计中如何合理使用它们。
摘要由CSDN通过智能技术生成

c++类定义

衍生于结构体Struct,
定义了类对象包括什么(数据成员, 属性)和可以对这个对象进行什么操作(操作)。

类定义的一般格式:

class 类名{
   
//数据成员
《《private:》
	成员1;》
《public:
成员2;》
《protected:
成员3;//函数操作
《《private:》
 函数返回类型 函数名(参数){
   函数体};》
《public:
成员2;》
《protected:
成员3;}

比如下列代码:

class Box
{
   
   public:
      double length;   // 长度
      double breadth;  // 宽度
      double height;   // 高度
      double getVolume()
      {
   
         return length * breadth * height;
      }
};

需要注意:

  • {}之内为类体,定义数据成员和函数操作
  • public, private, protected 为访问限定符
    1. 这三种限定符的作用域为:从该说明符出现开始到下一个说明符之前或类体结束之前
    2. 如果类体开始没有限定符修饰,默认为private
    3. 对于访问,只有public修饰的,可以通过对象访问,而private和protected不可通过类对象访问。还有一部分是在继承处使用

数据成员的访问

可以通过**直接成员访问运算符(.)**来访问成员。

#include <iostream>
 
using namespace std;
 
class Box
{
   
   public:
      double length;   // 长度
      double breadth;  // 宽度
      double height;   // 高度
      double getVolume()
      {
   
         return length * breadth * height;
      }
};


int main( )
{
   
   Box Box1;        // 声明 Box1,类型为 Box
   Box Box2;        // 声明 Box2,类型为 Box
   double volume = 0.0;     // 用于存储体积
 
   // box 1 详述
   Box1.height = 5.0; 
   Box1.length = 6.0; 
   Box1.breadth = 7.0;
 
 
   // box 1 的体积
   volume = Box1.height * Box1.length * Box1.breadth;
   cout << "Box1 的体积:" << volume <<endl;
 
   // box 1的体积
   volume = box1.getVolume()
   cout << "Box2 的体积:" << volume <<endl;
   return 0;
}

对象的创建和引用

对象的存储方案有两种,如第一个图为每一个对象分配全套的内存,包括存放成员数据的数据区和存放成员函数的代码区
但是,区别同一个类的中各个对象是由数据成员决定的,不同对象的数据成员内容是不同的;而行为是用函数来描述的,这些代码对于所有对象都是一样的。

假设每个对象的数据内存栈1KB,代码栈50KB,共占51KB,则 100个对象占5100KB,其中重复内存为4950KB,极其耗费内存。

因而采用第二种内存分配内存:
数据成员和在类内部定义实现的函数存放在数据区,而在类外部定义实现的函数放在公共代码区
在这里插入图片描述

在这里插入图片描述

  1. 直接定义类的实例–对象
    Box box1
    Box box1(参数值) 涉及到构造函数
  2. 动态创建
    • 创建
      指针变量名 =new类型名(初始化方式)
    • 删除
      delete 指针名
Box *pbox1=new Box();
delete pnox1;

c++ 类成员函数

1. 在类体内直接定义函数
2. 在类外定义函数

要使用范围解析运算符 ::,比如说在类内声明,类外定义实现函数getVolume():

class Box
{
   
   public:
      double length;   // 长度
      double breadth;  // 宽度
      double height;   // 高度
      double getVolume()};

double Box:: getVolume() {
   
         return length * breadth * height;
      }

注意:

  1. 范围解析运算符::前面加类名,表明该函数属于此类中
  2. 成员函数与内联 inline
    用于消除调用函数是所造成的固定时间的消耗的方法。
    在编译阶段将使用函数的定义体来替代函数调用语句c++内联函数解释

默认在类体内实现的成员函数都是内联的;如果在类体外定义函数,而仅在类体内给出函数声明,如果要实现内联,则在类外函数定义前加关键字inline


class A
{
   
    public:
    void Foo(int x, int y);
    
}

inline void A::Foo(int x, int y){
   } ;

但是呢,内联仅仅是对编译器的一个建议,C++标准规定仅当类的成员函数很小并且不包循环等复杂结构时,且这些成员函数的函数体在类内部直接定义或在外部定义为内联是,才使用内联扩展方式实现。但是,在具体的C++平台上也许根本不理睬内敛建议

构造函数和析构函数

  1. 构造函数
  • 定义: 类名(参数){}

  • 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行,并在该对象的生命周期中只会调用一次

  • 构造函数的名称与类的名称是完全相同的

  • 无函数返回类型,构造函数可用于为某些成员变量设置初始值

  • 构造函数可以重载,用不同的参数表区分

  • 若类定义中没有给出任何构造函数,c++编译器会自动生成默认的构造函数: 类名 (){},但是,只要程序员定义一个构造函数,系统就不会生成默认的构造函数

//演示重载构造函数
#include <iostream>
#include<cstring>
using namespace std;
 
class CGoods
{
   
   public:
      CGoods();
      CGoods(char [], int, float);
      CGoods(char[], float);
 
   private:
      char Name[20];
      int Amount;
      float Price;
      float Total_value;
};
// 构造函数定义

 CGoods::CGoods(){
   
 Name[0]='\0';
 Price=0.0;
 Amount=0;
 Total_value=0.0;
 }
 CGoods::CGoods(char name[], int amount, float price){
   
 strcpy(Name, name);
 Price=price;
 Amount=amount;
 Total_value=0.0;
 }
 CGoods::CGoods(char name[], float price){
   
 strcpy(Name, name);
 Price=price;
 Amount=0;
 Total_value=0.0;
 }


注意:

  • 如果想使用默认的构造函数,则在定义对象时不能使用括号
    比如:
    CGoods Car3; Car3为CGoods类的对象,定义时调用不带参数的构造函数,
    而,
    CGoods Car4(); 实际上并没有调用默认的构造函数,而是定义一个函数声明。

  • 构造函数的另一种初始化方式:

类名(参数列表): 数据成员1(参数值1), 数据成员2(参数值2)[...]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值