0
点赞
收藏
分享

微信扫一扫

【C++】类和对象(看这一篇就够了)

点亮自己的那盏灯 2022-03-31 阅读 20

目录

类的定义

类的访问限定符 

类的作用域 

类的实例化

 类对象模型

this指针 

 类的六个默认成员函数:

 构造函数

 析构函数:

 拷贝构造函数:

 运算符重载:

 赋值运算符重载: 

const成员

const修饰类的成员函数:

取地址及const取地址操作符重载 

再谈构造函数 

构造函数体赋值:

初始化列表: 

 explicit关键字

​  static成员: 

静态成员变量:

静态成员函数: 

友元

友元函数 

友元类 

内部类 


类的定义

class className{

}; //注意分号

类的两种定义方式:

1、声明和定义都放在类体中(注意:成员函数如果在类中定义,编译器可能会将其当作内联函数处理)

class Person {
public:
	void show() {
		cout << _name << "-" << _sex << "-" << _age << endl;
	}
public:
	char* _name;
	char* _sex;
	int _age;
};

2、声明放在头文件当中,定义放在源文件中。

 一般情况下,推荐方式二。

类的访问限定符 

种类:public(公有);protected(保护) ;private(私有的)

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。 

类的作用域 

C++中的作用域:全局作用域、函数体内部的局部作用域、命名空间、类域

类域:类定义了一个新的作用域,类的所有成员都在类的作用域中。在类外定义成员,需要使用::作用域解析符指明成员属于哪个类域。

类的实例化

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

类只是一个模型一样的东西,限定了类有那些成员,定义出一个类并没有分配实际的内存空间来存储它。

一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。

 类对象模型

计算类对象的大小

空类的大小:

this指针 

C++编译器给每个“非静态的成员函数”增加一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。 

this指针的特性:

this指针存在哪里?

this指针可以为空吗?

 类的六个默认成员函数:

 构造函数

特点:

但此时不能再用默认无参构造函数了,如果想用无参构造,可以传递全缺省参数。

编译器生成的默认的构造函数到底有什么用?

C++把类型分为内置类型(基本类型)和自定义类型。内置类型就是语法已经定义好的类型:如int/char,自定义类型就是我们使用class/struct/union自己定义的类型,看下面的程序,就会发现编译器生成默认的构造函数会对自定义类型成员_t调用它的默认函数。

class Time
{
public:
	Time()
	{
		cout << "Time()" << endl;
		_hour = 0;
		_minute = 0;
		_second = 0;
	}
private:
	int _hour;
	int _minute;
	int _second;
};

class Date {
private:
	int _year;
	int _month;
	int _day;
	Time _t;
};
 
int main() {
	Date d2;
	return 0;
}

 析构函数:

 概念:

特点:

 拷贝构造函数:

概念:只有单个形参,该形参是对本类类型对象的引用(一般使用const修饰),在用已存在的类类型对象创建新对象的时候,由编译器自动调用。

特性:

 运算符重载:

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通函数类似。

函数名字为:关键字operator后面接需要重载的运算符符号。

函数原型:返回值类型 operator操作符(参数列表)

 作为类成员的重载函数:

注意事项:

 
赋值运算符重载: 

1、形式

2、参数类型:

一般都是类类型对象的引用,相较于传值这样就会少了形参实例化的拷贝构造

3、返回值:

一般返回*this

是类类型对象的引用

4、检测是否在给自己赋值

if(this != &d)

const成员

const修饰类的成员函数:

1、const对象可以调用非const成员函数吗?

2、非const对象可以调用const成员函数吗?

3、const成员函数内可以调用其他的非const成员函数吗?

4、非成员函数内可以调用其他的const成员函数吗?

取地址及const取地址操作符重载 

这两个默认成员函数一般不用重新定义,编译器默认会生成。

这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况才需要重载,比如想获取到指定的内容。 

再谈构造函数 

构造函数体赋值:

初始化列表: 

 explicit关键字

构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。如下:

加上关键字,将会禁止单参构造函数的隐式转化:

  
static成员: 

静态成员变量:

特性:

面试题:实现一个类,计算程序中创建了多少类对象。

静态成员函数: 

特性:

友元

友元函数 

当我们尝试重载operator<<的时候,会发现我们没办法将operator<<重载成成员函数:

这样就可以了:

 友元函数的使用:

友元函数注意事项:

友元类 

 

内部类 

概念:

特性:

 

 

举报

相关推荐

0 条评论