【C++】结构体、类和引用

简介: 【C++】结构体、类和引用

注:最后有面试挑战,看看自己掌握了吗


结构体和类

  1. C++结构体中可以有函数
  2. 称为成员函数
#include <iostream>
struct point
{
  int x;
  int y;
  void output()
  {
    std::cout<<x<<std::endl<<y;
  }
};
void main()
{
  point pt;
  pt.x=0;
  pt.y=0;
  pt.output();
}
  1. C++中,结构体使用关键字struct声明的类
  2. 差异:结构体默认成员公有public
  3. :默认成员为private

构造函数

  1. 构造函数名字一定和类名相同
#include <iostream>
using namespace std;
class point
{
public:
  int x;
  int y;
  point()
  {
    x=0;
    y=0;
  }
  point(int a,int b)
  {
    x=a;
    y=b;
  }
  void output()
  {
    cout<<x<<endl<<y<<endl;
  }
};
void main()
{
  point pt(5,5);
  pt.output();
  point cc;
  cc.output();
}

析构函数

  1. 格式 ~类名()
  2. 不允许带参数
  3. 一个类只有一个
  4. 在程序调用delete删除对象时,析构函数被自动调用
  5. 对于一个对象,析构函数是最后一个被调用的成员函数
  6. 我们可以为某些成员变量分配堆内存
  7. 然后析构函数释放对象运行期间申请的资源

#include <iostream>
using namespace std;
class Student
{
private:
  char* pName;
public:
  Student()
  {
    pName = new char[20];
  }
  ~Student()
  {
    delete[] pName;
  }
};
  1. 在堆上分配20个字节,结束的时候释放堆上的内存

this指针

  1. this是隐含的指针,指向对象本身,代表对象的地址
  2. pt对象创建的时候,默认this = &pt

类的继承

  1. #pragma once是一个比较常用的C/C++预处理指令,只要在头文件的最开始加入这条预处理指令,就能够保证头文件只被编译一次。

#include"标头.h"
using namespace std;
class animal
{
public:
  void eat()
  {
    cout<<"animal eat"<<endl;
  }
  void sleep()
  {
    cout<<"animal sleep"<<endl;
  }
  void breathe()
  {
    cout<<"animal breathe"<<endl;
  }
};
class fish:public animal
{
};
class dog :public animal
{
};
void main()
{
  animal an;
  fish fh;
  an.breathe();
  fh.breathe();
  dog dd;
  dd.breathe();
}
  1. public 任意地方访问
  2. protected 只能在子类里访问
  3. private 只能在该自身
  4. 类的多重继承
#include <iostream>
using namespace std;
class B1
{
public:
  void output();
};
class B2
{
public:
  void output();
};
void B1::output()
{
  cout<<"call the class B1"<<endl;
}
void B2::output()
{
  cout<<"call the class B2"<<endl;
}
class A:public B1,public B2
{
public:
  void show();
};
void A::show()
{
  cout<<"call the class A"<<endl;
}
void main()
{
  A a;
  //a.output();         //该语句编译时会报错
  a.show();
}

虚函数与多态性、纯虚函数

  1. 子类父类的关系就是,子类是父类的扩充,就是多一块内存空间
  2. 所以子类转父类不用强转

animal *pAn;
   fish fh;
   pAn=&fh;

虚函数与多态

#include <iostream>
using namespace std;
class animal
{
public:
   void eat()
   {
      cout<<"animal eat"<<endl;
   }
   void sleep()
   {
      cout<<"animal sleep"<<endl;
   }
   virtual void breathe()
   {
      cout<<"animal breathe"<<endl;
   }
};
class fish:public animal
{
public:
   void breathe()
   {
      cout<<"fish bubble"<<endl;
   }
};
void fn(animal *pAn)
{
   pAn->breathe();
}
void main()
{
   animal *pAn;
   fish fh;
   pAn=&fh;
   fn(pAn);
}//结果是fish bubble
  1. 虚函数就像接口等着实现
  2. 多态:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时会根据对象的实际类型来调用相应函数
  3. c++在编译的时候,如果发现virtual,会采用迟绑定
  4. 在运行时,看对象的类型来确定哪个函数被调用-----------多态性

纯虚函数

virtual void breathe() = 0;
  1. 纯虚函数是一种特殊的虚函数,它的一般格式如下(C++格式):
class <类名>
{
virtual <类型><函数名>(<参数表>)=0;
};
  1. 在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

覆盖和隐藏

  1. 隐藏:当父类函数与派生类函数同名,并且父类函数 virtual关键字修饰,无论父类与派生类参数个数与类型是否相同,此时派生类函数隐藏父类所有同名函数
  2. 覆写:当父类函数与派生类函数同名,并且参数相同,返回值相同,并且父类函数 virtual关键字修饰,此时派生类函数覆写父类函数

引用

  1. 引用会使用同一块地址
  2. 常用于传参--------------节省空间,也更直观
int a=5;
int &b=a;
void f(int& a, int &b)
{
}

C++类的设计习惯及头文件包含问题

  1. 函数在头文件加入virtual后,在cpp文件就不用加virtual了
  2. 重复定义,
#ifndef XXX//名字随便取,一般有实际意义 比如ANIMAL_H
#define XXX
class animal
{
public:
  animal();
  ~animal();
  void eat();
  void sleep();
  virtual void breathe();
};
class doge
{
};
#endif // !XXX

🍃博主昵称:一拳必胜客

特别鸣谢:木芯工作室 、Ivan from Russia


相关文章
|
1月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
52 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
109 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
102 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
129 4
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
33 4
|
2月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
33 4
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
30 1
|
2月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
2月前
|
存储 编译器 C语言
【C++打怪之路Lv3】-- 类和对象(上)
【C++打怪之路Lv3】-- 类和对象(上)
21 0
|
2月前
|
存储 编译器 C语言
深入计算机语言之C++:类与对象(上)
深入计算机语言之C++:类与对象(上)