【C++】类与对象(一)

1.面向过程和面向对象初步认识

C语言面向过程的语言,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

C++基于面向对象的,关注的是对象,将一件事拆分成不同的对象,靠对象之间的交互完成。

2.类的引入

C语言结构体只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数

其实这个就相当于我们C++中的类,不过我们通常在C++中,用 class 代替。

接下来举一个struct来定义的“类”:

struct S//struct默认public,因为要兼容C
{
	int a = 3;
	int Add(int a, int b)
	{
		return a + b;
	}
};

int main()
{
	S st;
	int c = st.Add(1, 2);
	cout << c << endl;
	return 0;
}

3.类的定义

class classname
{
    //类体
    
};//注意加分号

class是定义类的关键字,classname为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略

类体中内容称为类的成员:类中的变量称为类的属性成员变量;类中的函数称为类的方法或者成员函数

类的方法两种定义方式

1.声明和定义全部放入类体,注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。

2.类声明放在类体中(放在类的头文件.h里面),成员定义放在.cpp文件里面

//.cpp
void Stack::Init()
{
	_a = nullptr;
	_top = 0;
	_capacity = 0;
}
//.h
class Stack
{
public://
	void Init();
private:
	int* _a;
	int _top;
	int _capacity;
};

4.类的访问限定符及封装

C++实现封装的方式:用类将对象的属性和方法结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

C++访问限定符:public(公有),protected(保护),private(私有)

说明

  1. public修饰的成员在类外可以直接被访问
  2. protected和private在类外不能直接被访问
  3. class默认访问权限为private,struct默认为public(因为要兼容C)

5.类的作用域

类定义了一个新的作用域,类的所有成员在类的作用域中,在类外定义成员时,需要::

作用域操作符。

6.类的实例化

用类类型创建对象的过程,称为类的实例化

  1. 类中的成员(除函数)都只是声明,类就像一个模型,并不会开空间
  2. 实例化出来的对象才占内存
  3. 类对象所占字节(空间),不包括成员函数 ,只包括成员变量
  4. 实例化的类对象的成员函数地址相同,在公共区域内
class A
{
public:
    void f()
        {
            cout<<1<<endl;
        }
private:
    int _a;
};

int main()
{
    A* a1=nullptr;
    a1->f();
    return 0;
}

所以以上代码不会报错,因为函数不在类对象中,自然不会进入类对象查找,而是直接进入公共区域,但是如果函数需要访问类中的成员变量则会报错;或者此时访问的是_a,则进入类对象查找,空指针的解引用,程序会报错。

计算类的大小:

  1. 遵循结构体对齐原则
  2. 只计算成员变量

7.this指针

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
    Date d1;
    Date d2;

    d1.Init(2024,5,30);
    d1.Print();

    d2.Init(2024,6,4);
    d2.Print();

    return 0;
}

Print函数没有参数,且每一个类对象的成员函数地址一致,为什么d1,d2用其却结果不同呢?

这里就要说到类的this指针

this指针特性

  1. 类型:类类型*const 
  2. 本质上是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参,所以对象中不存储this指针
  3. 是成员函数第一个隐含的指针形参,一般不需要用户传递
  4. this一般放在栈里面
  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值