C++学习笔记——构造函数实例

/************************************************************************************************************************************************
1.    面向对象的四个特征:(1)抽象(2)封装(3)继承(4)多态
2.    用关键字class声明一个类,没有为该类分配内存,他只是告诉编译器该类是什么,它包含了哪些类型的数据和功能。
    同时他还告诉编译器该类有多大。类的大小是根据该类的变量的数据类型来确定的。
3.    要使用类名来定义一个对象。运算符来访问该对象的数据成员以及成员函数并且可以给对象的数据成员赋值。对象只能调用类中存在的方法。
4.    类的成员函数与数据成员默认为私有,可以用关键字 public声明为公有,private声明为私有,protected说明为保护,virtual说明为虚函数。
5.    头文件与源文件:头文件以.h格式,源文件以.cpp格式。可以在.cpp文件中加载.h的头文件。可以把类定义在.h的头文件中,然后在.cpp中调用这个.h的头文件。
6.    函数是用来执行一定功能的代码块,成员函数则是只能被类的对象所使用的函数:对象只能使用该类提供的函数。
7.    类只是一个抽象的名词,对象则是实际的个体,所以不要给类赋值。
8.const成员函数:如果不想让某个成员函数修改成员变量的值,可以将这个成员函数声明或定义为const成员函数。
************************************************************************************************************************************************/
/************************************************************************************************************************************************
内联函数
    用关键字inline来声明函数为内联函数。当我们定义了一个函数后,编译器就会在内存中为其创建一个指令集。当我们调用这个函数时,程序就会跳转到该指令集处。
当该函数运行完毕后,程序又会返回到原来执行调用该函数语句的下一行继续执行。当声明了一个内联函数时,编译器不会创建真正的函数,而只是将这个内联函数的所有
代码复制到调用函数中,这样程序在执行调用该函数时就不需要来回跳转,自然就提高了程序运行时的效率。内联函数又分显示声明和隐式声明。在定义函数时在函数返回
值类型前加上inline关键字就是显示声明,将函数体直接放到函数头后面也就是说函数的声明和定义合并在一起,这种方法称之为隐式声明。也可以将类的成员函数说明为
内联函数inline 。
************************************************************************************************************************************************/
/************************************************************************************************************************************************
在面向对象程序中,类是最基本的数据类型,而对象则是用该类型定义出来的变量。
当定义某类的对象时,会自动调用该类的构造函数来初始化对象,而当该对象的寿命结束时,又会自动调用析构函数来回收它所占用的内存。
类是实现面向对象编程的基础,也是特殊的数据类型,它将数据和方法关联起来。每个对象都可看作是数据和方法的集合。这样可便于分类。类的成员可以是公有的或私有的。这意味着某人的隐私只有他自己知道,别人是无权过问的。这使得数据的安全性大大增强。
************************************************************************************************************************************************/

#include <iostream>
#include <string>

using namespace std;

class Human		//使用class关键字声明一个类
{
public:			//声明权限是公有,如果不声明默认为私有。公有成员允许该类的对象直接访问,私有则不允许。
	Human()
	{			//在调用默认构造函数的时候会创建一个对象 !!!构造函数没有返回值!!!
		total++;
		cout << "Human类的构造函数" << endl;
	}

	Human(int a) :age(a)
	{			//带参数的构造函数,且初始化了数据成员变量
		total++;
		cout << "Human类的带一个参数的构造函数" << endl;
	}

	Human(int x1, int x2, int x3) :height(x1), weight(x2), age(x3)
	{
		total++;
		cout << "Human类的带三个参数的构造函数" << endl;
	}

	Human(Human const &hu)
	{			//复制构造函数,创建该对象的一个副本
		cout << "Human类的复制构造函数" << endl;
	}

	~Human()
	{			//在对象被销毁后清楚该对象所占用的内存,此时会被自动调用。析构函数没有返回值!!!
		total--;
		cout << "Human类的析构函数" << endl;
	}

	void static showtotal()
	{			//静态成员函数,只有类中的静态函数才可以调用静态成员
		cout << Human::total << endl;
	}

	void set_height(int h)
	{									//成员函数,作为设置private私有数据成员变量的接口来设置数据成员
		height = h;						//隐式内联函数,定义和声明合并在一起
	}

	void set_weight(int w)
	{
		weight = w;
	}

	void set_age(int a)
	{
		age = a;
	}

	inline void set_name(string);		//在类中声明显式内联函数,然后在类外定义该函数。

	int get_height()			//成员函数,返回赋值后的私有成员变量的值。
	{
		return height;
	}

	int get_weight()
	{
		return weight;
	}

	int get_age()
	{
		return age;
	}

	void const get_name() const		//用关键字const将get_name()函数声明为常量
	{
		cout << name << endl;
	}



private:				//声明为私有,私有成员不能直接访问,必须通过公有成员或成员函数作为接口才可以访问
	static int total;		//声明为静态成员变量,静态成员变量不属于任何对象,只属于类。
	int height;		//数据成员变量
	int weight;
	int age;
	string name;
};

int Human::total = 0;	//在类外为Human类的静态成员变量赋值(全局变量)

void Human::set_name(string n)	//在类外定义类的内联成员函数
{
	name = n;
}

inline double func(double, double, char);	//用inline关键字把func函数声明为内联函数

double func(double a, double b, char c)		//内联func函数的定义部分
{
	if (c == '+')
	{
		return a + b;
	}
	else if (c == '-')
	{
		return a - b;
	}
	else if (c == '*')
	{
		return a * b;
	}
	else if (c == '/')
	{
		return a / b;
	}
	else
	{
		cout << "无法解析的运算" << endl;
	}
	return 0;
}

int main()
{
	Human zhangsan;			//定义了一个Human类的对象
	zhangsan.set_age(28);		//通过公有函数set_age作为接口设置私有成员变量age的值
	zhangsan.set_height(168);
	zhangsan.set_weight(70);
	zhangsan.set_name("张三");		//通过共有成员函数set_name(作为接口设置私有成员变量) string name的值,字符串要用双引号括起来"" 。
	cout << "身高" << zhangsan.get_height() << "CM,体重" << zhangsan.get_weight() << "KG,年龄" << zhangsan.get_age() << "岁." << endl;
	cout << "姓名:";
	zhangsan.get_name();
	Human::showtotal();		//调用静态成员函数,因为静态成员函数作为静态成员变量的接口,所以可以间接访问到静态成员变量。
	Human mike(45, 170, 80);		//定义了Human类的一个对象且带三个参数,会自动调用Human类中带三个参数的构造函数。
	cout << mike.get_age() << mike.get_height() << mike.get_weight() << endl;
	double a, b;
	char c;
	cout << "单目运算式" << endl << "请输入要进行计算的算术式,例如:3.14*100,不可写成双目例如3.14*10*10 !" << endl;
	cin >> a >> c >> b;
	cout << "您要进行的计算式为:" << a << c << b << endl;
	cout << "运算式的结果为" << a << c << b << "=" << func(a, b, c) << endl;
	Human man[5];		//创建一个由5个Human类的对象组成的数组,对象数组。
	(*man).set_name("张五");		//man代表数组man[5]中的第一个元素的首地址。(*man)取第一个元素的首地址处的数据也就是Human类
									//在数组man[5]中的第一个对象。然后用.操作符调用该对象的成员函数set_get()来设置私有成员变量name
	(*man).get_name();		//调用成员函数get_name来输出私有成员变量name。(*man)同等于(man[0])
	man[2].set_age(30);		//调用数组man[5]中第三个元素也就是数组中的第三个Human类的对象的成员函数set_age()来设置私有成员变量age的值
	cout << man[2].get_age() << endl;		//输出数组man[2]中下标为2(地三个元素(对象))的Human类的对象的成员函数get_age()的返回值age
	return 0;
}

猜你喜欢

转载自blog.csdn.net/LKZYnih/article/details/81489801