[C++]:类与对象(一)

本文深入探讨C++中类的定义与实例化,解析成员函数、访问限定符、作用域、类大小计算及this指针的概念。通过具体示例,帮助理解类的构造与使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.类的定义

  • 定义和声明全在类内
class Date
{
  public:
     void showInfo(){}
  private:
     int _day;
     int _month;
};
  • 声明在头文件,定义在.cpp文件之中
//date.h文件
class Date
{
 public:
    void showInfo();
 private:
    int _day;
    int _month;
};
//date.cpp文件

#include"date.h"
void Date::showInfo()
{
     cout <<_month<<--<<_day<< endl;
}

类的定义一般有以上两种方式,但是后者更加规范。
在上面的demo里,我们可以看到,类的定义关键词是class,Date是类名,{}里类的主体,并且以;号结尾。
其中类的元素,称为类的成员,函数称为类的成员函数,数据称为成员变量。

二.类的访问限定符

  • 访问限定符有三种:public,private,protected
  • public修饰的成员可以被类外进行访问,private和protected修饰不可。
  • class的默认访问权限是private,而struct默认的是public

三.类的作用域与实例化

  • 类定义了一个作用域,如果需要在类外定义成员,那么就要使用::作用解析符,指明成员属于哪个域。
  • 类创建对象的过程,称之为类的实例化
class Person
{
    public:
        void display(){}
    private:
        char* _name;
        int _age;
};
void test()
{
//实例化
     Person man;
     man._name = "Pony"
     man._age = 10;
     man.display();
}

四.类的大小的计算

  • 一个类的大小,其实就是所有成员变量之和,当然也遵循内存对齐(就是结构体的对齐规则),如果是空类,编译器给了一个字符唯一标识这个类。
    看这样一个demo:
class A
	{
	public :
		void fun1() {}
	private:
		int _num;
	};
class B
	{
	public:
		void fun2() {}
	};
class C
	{};
	cout << sizeof(A) << endl;
	cout << sizeof(B) << endl;
	cout << sizeof(C) << endl;

上面的输出结果是4,1,1,这就说明了类的大小其实就是成员变量之和。

五.this指针

  • this指针的类型:类类型 * const
  • 只能在成员函数内部使用
  • 是成员函数的第一个隐含的形参,由编译器调用

先看这样一个例子:可以编译通过吗?

	class A
	{
	public:
		void fun()
		{
			cout <<" Hello" << endl;
		}
	private:
		int a;
	};
	int main()
	{
	   A*p = NULL;
	   p->fun();
	   return 0;
	}

事实上,上面的例子可以输出,这是为什么呢?p是一个NULl指针,调用成员函数不会出错误?其实p->fun()是fun(b);因为没有fun函数没有访问成员,所以不存在解引用,所以正常输出;我们可以通过一个例子来验证

class A
	{
	public:
		void fun()
		{
			cout <<" Hello" << endl;
		}
		void fun2()
		{
			cout << a << endl;
		}
	private:
		int a;
	};
int main()
	{
	   A*p = NULL;
	   p->fun();
	   p->fun2();       //引发程序崩溃
	   return 0;
	}
  • 在非静态成员函数内部可以直接使用 this 关键字,this 就代表指向该函数所作用的对象的指针
    看下面这个程序:
class price
	{
	public:
		int num, cost;
		price(int n, int c)
			:num(n),cost(c){}
		price add()
		{
			this->cost++;
			return *this;
		}
	};
	price n1(1,1), n2(0,0);
	n2 = n1.add();
	cout << n2.num<< n2.cost << endl;

//输出结果:1,2

第九行的this的类型是price*,所以this->cost就是cost,*this就是n1,所以n2的值才会变成n1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值