C++总结篇(2)类和对象

1、类

1.1类的定义:
C++是一门面向对象的语言,便就引入了类的概念,类在一定程度上与C语言中的结构体很相似。Class为定义类的关键字,如下示例:

class  student
{
	char name[10];
	int age;
	int  print();
};

类不仅可以用class来定义,还可以用struct定义,因为C++完全包含C语言,二者不同的是,再类中没有访问限定时,class默认private访问方式,struct默认public访问方式。

1.2类的使用:
类的成员都在类的作用域中,在外部无法直接调用,需要使用作用域解析符,示例如下:

class  student
{
public:
	char name[10];
	int age;
	void  print();
};
void student::print()
{
	cout << age << endl;
}

1.3类的大小:
类与结构体一样,都有大小,即所有成员大小之和,但仍遵守内存对齐原则,空类的大小为1个字节。内存对齐规则如下:

  1. 第一个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 =编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的对齐数为8,gcc中的对齐数为4
  3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是 所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

1.4类的访问方式:
private(私有):在类外不能调用
public(公有:可在类外调用
proteted(保护):在类外不能调用

访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

2、this指针

2.1作用:
如果一个类定义了很多个对象,在调用某个对象中的成员函数来访问某一变量时,都是通过指针来访问的,编译器自动给成员函数添加了一个指针参数,这个指针便是this指针,其指向需要访问的变量。
2.2this指针特性:

  1. this指针的类型:类类型* const
  2. 只能在“成员函数”的内部使用
  3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参。所以对象中不存储this指针。
  4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

3、构造函数

3.1概念
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员 都有 一个合适的初始值,并且在对象的生命周期内只调用一次。
3.2 特性:

  1. 函数名与类名相同。
  2. 无返回值。
  3. 对象实例化时编译器自动调用对应的构造函数。
  4. 构造函数可以重载。
  5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定 义编译器将不再生成。
  6. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。

3.3 示例:

class  A
{
public:
	A(int x, int y)
	{
		a = x;
		b = y;
	}
	void print()
	{
		cout << a << " " << " " << b << endl;
	}
private:
	int a;
	int b;
};
int  main()
{
	A a(1,2);
	a.print();
	system("pause");
	return  0;
}

4、析构函数

4.1 概念:
与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而 对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。析构函数也是特殊的成员函数。
4.2 特性:

  1. 析构函数名是在类名前加上字符 ~。
  2. 无参数无返回值。
  3. 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
  4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。

4.3 示例:

class  A
{
public:
	A(int x, int y)
	{
		a = x;
		b = y;
		ptr = (int *)malloc(sizeof(int));
	}
	~A()
	{
		if (ptr)
		{
			free(ptr);
			ptr = nullptr;
		}
		a = 0;
		b = 0;
	}
private:
	int a;
	int b;
	int *ptr;
};

5、拷贝构造函数

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

  1. 拷贝构造函数是构造函数的一个重载形式。拷贝构造函数的参数

  2. 只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。

    5.3 示例:

class  A
{
public:
	A(int x, int y)
	{
		a = x;
		b = y;
		ptr = (int *)malloc(sizeof(int));
	}
	A(const A& d)
	{
		a = d.a;
		b = d.b;
	}
private:
	int a;
	int b;
	int *ptr;
};

6、赋值运算符重载

6.1 概念:
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号。
6.2规则:

  1. 不能通过连接其他符号来创建新的操作符:比如operator@
  2. 重载操作符必须有一个类类型或者枚举类型的操作数
  3. 用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义
  4. 作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的
  5. 操作符有一个默认的形参this,限定为第一个形参 .* 、:: 、sizeof 、?: 、。

6.3 示例:

class  A
{
public:
	A(int x, int y)
	{
		a = x;
		b = y;
		ptr = (int *)malloc(sizeof(int));
	}
	bool operator==(const A &d1)
	{
		return (d1.a == a&&d1.b == b);
	}
private:
	int a;
	int b;
	int *ptr;
};

7、友元函数

7.1 概念:
友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声 明,声明时需要加friend关键字。
7.2 特性:

  1. 友元函数可访问类的私有成员,但不是类的成员函数

  2. 友元函数不能用const修饰

  3. 友元函数可以在类定义的任何地方声明,不受类访问限定符限制

  4. 一个函数可以是多个类的友元函数

  5. 友元函数的调用与普通函数的调用和原理相同

    7.3 示例:

class  A
{
friend  void print(const A& d);
public:
	A(int x, int y)
	{
		a = x;
		b = y;
	}
private:
	int a;
	int b;
};
void print(const A& d)
{
	cout << d.a << " " << d.b << " " << endl;
}

8、友元类

8.1 概念:
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
8.2 特性:

  1. 友元关系是单向的,不具有交换性。
  2. 比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time
  3. 类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
  4. 友元关系不能传递,如果B是A的友元,C是B的友元,则不能说明C时A的友元
  5. 友元类需要前置声明

你可能感兴趣的:(C/C++)