0903C++类和对象基础3

119 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

1.1 初始化列表

作用: C++提供了初始化列表语法,用来初始化属性 语法:构造函数():属性1(值1),属性2(值2)... {}

1.传统初始化

class books
{
public:
    	books(string book01,string book02,string book03)
	{
	      h_b01 = book01;
		  h_b02 = book02;
		  h_b03 = book03;	
	}
	string h_b01,h_b02,h_b03;
};
books h_b("黑魔法手帖","夜航西飞","薄荷双生"); 
	cout << "h看的书有:" << h_b.h_b01<<" " <<h_b.h_b02<<" " << h_b.h_b03<<" " << endl;

输出:

h看的书有:黑魔法手帖 夜航西飞 薄荷双生
请按任意键继续. . .

2. 初始化列表方式初始化

class books
{
public:
    	books(string book01,string book02,string book03):
		h_b01(book01),h_b02(book02),h_b03(book03){}
		void print_books()
		{
			cout << "h看的书有:" << h_b01<<" " <<h_b02<<" " << h_b03<<" " << endl;
			}	
private:
	string h_b01,h_b02,h_b03;
};
books h_b("黑魔法手帖","夜航西飞","薄荷双生"); 
	h_b.print_books();

输出:

h看的书有:黑魔法手帖 夜航西飞 薄荷双生
请按任意键继续. . .

1.2 类对象作为类成员

C++类中的成员可以是另一个类的对象,我们称该成员为 对象成 例如:

class A {}
class B
{
    A a;
}
class books
{
public:
    	books(string book01):	h_b(book01){
		}
	~books(){
	}
	string h_b;
};
class student
{
public:
//b(b_n)相当于 books b = b_n;隐式转换法
    	student(string s_n,string b_n):h_s(s_n),b(b_n){
    		cout << h_s << "看的书是:"<< b.h_b << endl; 
		}
		~student()
		{
			}	
	string h_s;
	books b;
};
student s1("Mona","夜航西飞"); 

输出:

Mona看的书是:夜航西飞
请按任意键继续. . .

问题: B类中有对象A作为成员,A为对象成员 那么当创建B对象时,A与B的构造和析构的顺序是谁先谁后?

class books
{
public:
    	books(string book01):	h_b(book01){
    		cout << "调用了books的构造函数"<< endl; 
		}
	~books(){
		cout << "调用了books的析构函数"<< endl;
	}
	string h_b;
};
class student
{
public:
    	student(string s_n,string b_n):h_s(s_n),b(b_n){
    		cout << h_s << "看的书是:"<< b.h_b << endl; 
    		cout << "调用了student的构造函数"<< endl; 
		}
		~student()
		{
		cout << "调用了student的析构函数"<< endl;
			}	
	string h_s;
	books b;
};

输出:

调用了books的构造函数
Mona看的书是:夜航西飞
调用了student的构造函数
请按任意键继续. . .
调用了student的析构函数
调用了books的析构函数

--------------------------------
Process exited after 15.19 seconds with return value 0
请按任意键继续. . .

结论:

当类中成员是其他类对象时,我们称该成员为对象成员 构造的顺序是 :先调用对象成员的构造,再调用本类构造 析构顺序与构造相反

1.3 静态成员

1. 概述

  • 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员 静态成员分为:
  • 静态成员变量
    • 所有对象共享同一份数据
    • 在编译阶段分配内存
    • 类内声明,类外初始化
  • 静态成员函数
    • 所有对象共享同一个函数
    • 静态成员函数只能访问静态成员变量

2. 静态成员变量

  • 静态成员变量特点:
    • 1 在编译阶段分配内存
    • 2 类内声明,类外初始化
    • 3 类内不能重新赋值,类外可以
    • 4 所有对象共享同一份数据
class books
{
//静态成员变量也是有访问权限的
public:
	static string h_b;
//private: 
//    static string h_b1; //静态成员变量也是有访问权限的
};
string books::h_b = "夜航西飞"; 
//string books::h_b1 = "夜航西飞";//类外访问不到私有权限静态成员变量
//错误提示:[Error] 'std::string books::h_b1' is private
int main() 
{
    //静态成员变量两种访问方式
    //1、通过对象
	books b1;
	b1.h_b = string("薄荷双生");
	cout << b1.h_b<< endl;
	books b2;
	b2.h_b = string("梦的宇宙志");
	cout << b2.h_b<< endl;
	cout << b1.h_b<< endl;
	//2、通过类名
	books :: h_b = string("黑魔法手帖");//共享同一份数据
	cout << b2.h_b<< endl;
	cout << b1.h_b<< endl;
	system("pause");
	return 0;
}

输出:

薄荷双生
梦的宇宙志
梦的宇宙志
黑魔法手帖
黑魔法手帖
黑魔法手帖
请按任意键继续. . .

2. 静态成员函数

  • 静态成员函数特点:
    • 1 程序共享一个函数
    • 2 静态成员函数只能访问静态成员变量
#include<iostream>
#include<string>
using namespace std;

class books
{
public:
       static void change01(string a)
	{
		h_b = a;
//		h_b1 = a;//错误,不可以访问非静态成员变量.无法区分是哪个对象的h_b1
//错误提示:[Error] invalid use of member 'books::h_b1' in static member function
		cout << "change01调用" << endl;
		cout << h_b << endl;
	
	}
	static string h_b;
//	string h_b1;
//private://静态成员函数也是有访问权限的
//      static void change02()
//	{
//		cout << "change02调用" << endl;
	
//	} 
};
string books::h_b = "夜航西飞"; 
int main() 
{
	//静态成员变量两种访问方式
		//1、通过对象
	books b1;
	b1.change01("Mona");
	 //2、通过类名
	books :: change01("h");
//	b1.change02();//类外访问不到私有权限
//[Error] 'static void books::change02()' is private
	system("pause");
	return 0;
}

输出:

change01调用
Mona
change01调用
h
请按任意键继续. . .

注意:

  • 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。
  • 成员函数可以定义在类定义内部,或者单独使用范围解析运算符 :: 来定义。在类定义中定义的成员函数把函数声明为内联的,即便没有使用 inline 标识符。
  • 在 :: 运算符之前必须使用类名。调用成员函数是在对象上使用点运算符( . ),这样它就能操作与该对象相关的数据。
  • 一个类可以有多个 public、protected 或 private 标记区域。每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。成员和类的默认访问修饰符是 private。
  • 公有成员在程序中类的外部是可访问的。您可以不使用任何成员函数来设置和获取公有变量的值。就是说你可以直接用对象+“.”(点运算符)的方式来为公有变量赋值。