c++类入门

首先看一下类长什么样

class Circle   //class name 类的名字
{
	private://access control
	double radius;    //data members   成员变量
	stirng color;
	public:
	double getRadius()   //member function,成员函数
	{
		return radius;  
	}
};//Don't forget the semicolon 别忘记分号了

contrast with struct

结构体的短板:

  1. 指针操作,读取越界
  2. 无法进行数值检查
  3. 内部数据状态被公共访问
  4. 用户使用结构体时需要显式地调用每一位成员

CLASS

Term术语

class Circle   //class name 类的名字
{
	private://access control
	double radius;    //data members   成员变量
	stirng color;
	public:
	double getRadius()   //member function,成员函数
	{
		return radius;  
	}
};//Don't forget the semicolon 别忘记分号了

Public(公有) and Private(私有)

public 和 private是控制着访问权限

  • public:公有的成员函数和成员变量在整个系统都可以访问和使用
  • private:私有的成员函数和成员变量只有类本身具有对他的访问权和使用权

若无基础可先看完类的构造再回头看以下内容

例如,在上面的例子中,radius(半径)是声明在private里面的成员。那么,只有Circle类的内部拥有对其的使用权,在类的外部是无法对其操作的。下面看一个例子

int main()
{
	Circle c1 = Circle();
	cout << c1.radius << endl;
}

上式是不允许的,外部系统对c1没有操作权限。只有通过公有的函数才能获取到私有变量

成员

成员分成员函数和成员变量,定义在类中的变量都叫成员变量,定义在类中的函数都叫成员函数
![[Pasted image 20231116194625.png]]
上述例子中,radius和color都是成员变量,getRadius是成员函数

构造函数(Constructor)

有类对象,必要调用类构造函数
构造函数在创建类对象时被调用
在创建类对象时:编译器回分配内存,调用构造函数

构造函数长这样

Circle(double r, string c)
{
	radius = r;
	color = c;
}

构造函数的特点

  • 构造函数的名字和类名相同
  • 没有返回值(或者返回值为void)因此在构造函数允许没有return语句
  • 是类的公有函数
  • 每次构造类对象时都会调用构造函数
  • 不可继承(类的继承特性)

当你没有写构造函数时,c++编译器会提供一个没有参数没有内部为空的默认构造函数.

创建类对象

当你创建类对象时,构造函数会被自动调用。如果你定义了一个默认构造函数,你可以在不用显式地初始化的情况下声明类对象。

Circle(double r, string c)
{
	radius = r;
	color = c;
}
Circle(){}//类的构造函数可以重载

Circle c1;//call the default constructor implicitly
Circle c2 = Circle();//call the default construct explicitly
Circle *c3 = new Circle; // call the default constructor implicitly
Ciecle c4(1, "blue");// call the non-default constructor

上面几种方式都可以创建类对象
但是注意接下来的形式,容易发生错误

Circle c3();//这不是调用构造函数
//这里声明了一个函数

当你调用默认构造函数时,不要在后尾加括号

点操作符

可以有两种方式获取对象成员,.点操作符和->类成员访问操作符。和结构体相同,一个用于常规的对象,一个用于指针对象。

//声明并创建类Circle的实例c1和c2
Circle c1(1.2, "blue");
Circle c2(3.4, "green");

// 通过点操作符调用成员函数
cout << c1.getArea() << endl;
cout << c2.getArea() << endl;

// 通过点操作符引用成员变量
c1.radius = 5.5;//如果为私有变量时,请在类中操作
c2.radius = 6.6;//这里仅作展示

在不标识实例的情况下调用getArea是没有意义的,因为Circle类可以有很多个实例,每个实例都对应着不同的Area.

->类成员访问操作符,简而言之,当创建了一个类实例指针时,访问成员需要通过->,将上面的.都换成->就可以了

Circle *c3 = new Circle(3.4, "red"); 
cout << c3->getArea() << endl;

c3->radius = 6.6;//如果为私有变量时,请在类中操作,该处仅为展示

实例展示:

/* Circle类,所有代码均在同一文件中(CircleAIO.cpp) */
#include <iostream>    
#include <string>      
using namespace std;
 
class Circle {
private:
   double radius;      // 成员变量
   string color;       
 
public:
   // 带有默认参数的构造函数
   Circle(double r = 1.0, string c = "red") {
      radius = r;
      color = c;
   }
 
   double getRadius() {  //成员函数
      return radius;
   }
 
   string getColor() {   
      return color;
   }
 
   double getArea() {   
      return radius*radius*3.1416;
   }
};   // need to end the class declaration with a semi-colon
 
// 测试驱动程序功能
int main() {
   // 构造Circle类实例
   Circle c1(1.2, "blue");
   cout << "Radius=" << c1.getRadius() << " Area=" << c1.getArea()
        << " Color=" << c1.getColor() << endl;
 
   
   Circle c2(3.4); // 默认颜色
   cout << "Radius=" << c2.getRadius() << " Area=" << c2.getArea()
        << " Color=" << c2.getColor() << endl;
 
   
   Circle c3;      // 默认半径和颜色
   cout << "Radius=" << c3.getRadius() << " Area=" << c3.getArea()
        << " Color=" << c3.getColor() << endl;
   return 0;
}

析构函数

析构函数是以~为前缀,函数名和类名相同的特殊成员函数。
析构函数有以下特点:

  • 当实例销毁时调用析构函数
  • 没有返回值,没有参数
  • 只允许有一个析构函数,析构函数不允许重载
  • 如果没有写析构函数,编译器会自动提供一个析构函数
    示例:
class Student
{
	public:
		Student()
		{
			name = new char[1024]{0};
			born = 0;
			male = false;
		}
		~Student()
		{
			delete [] name;
		}
}

析构函数对于释放内存有帮助,尤其是在动态内存分配时。

默认构造函数

默认构造函数是一个当你创建一个类对象却不显式地初始化时调用地构造函数。
例如:

Student Tom;

当你没有提供任何构造函数时(包括有默认构造函数和含参构造函数),编译器会主动为你提供一个不含任何参数,内部为空地默认构造函数。每个类只允许有一个默认构造函数。

如果你在类中定义了任意的构造函数,编译器将不会再为你提供默认构造函数,你需要自己写一个不含参数的默认构造函数。

你有两种方式去写。一种是对含参的构造函数中的每一位参数提供默认参数。

class Box{
	private:
		double len;
		double breadth;
		double height;
};

Box(double len = 1, double bre = 1.0, double hei = 1.0);

或者使用函数重载的方式定义一个没有任何参数的构造函数

Box();

内容来源

  1. 南科大于仕琪教授c++
  2. 南洋理工大学Chua Hock-Chuan教授c++

以上内容仅供参考,内容可能出现错误

微信文章
欢迎您订阅微信公众号:cording logs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值