头文件student.h
#pragma once
#include <string>
#include <iostream>
using namespace std;
class student
{
public: //公有的
student(); //构造函数
/* 重载构造函数 */
student(int,string,char); //构造函数的重载规则和普通函数的重载规则一样
student(int); //重载并且初始化参数列表
/* 析构函数 */
~student(); //没有参数,只能有一个
void set() //在类里面定义成员函数
{
cin >> num;
/* 封装隐藏使num不小于0 */
if (num < 0)
{
num = 0;
}
cin >> name;
cin >> sex;
}
void display(); //打印函数声明
private: //私有的
int num;
string name;
char sex;
protected: //受保护的
};
student.cpp
#include "student.h"
student::student() //使用构造函数初始化数据成员
{
num = 0;
name = "0";
sex = 65;
}
student::student(int x,string z,char y) //带参数的构造函数重载
{
num = x;
name = z;
sex = y;
display(); //在构造函数里调用输出函数
}
student::student(int x) : name("李云龙"), sex(67) //初始化参数列表的构造函数
{
num = x;
display();
}
void student::display() //在类外定义display函数 ::作用域限定符 声明函数是属于哪个类的
{
cout << "num:" << num <<'\t';
cout << "name:" << name << '\t';
cout << "sex:" << sex << endl;
}
student::~student()
{
}
主文件main
#include <iostream>
#include <Windows.h>
#include <string>
#include "student.h"
using namespace std;
student stud1, stud2; //定义两个类对象
int main()
{
stud1.set(); //调用公有函数给变量赋值
stud1.display(); //stud1是对象,display是方法,stud1.display();就是一个发给对象的消息
stud2.display(); //调用构造函数初始化后的结果
stud2 = stud1; //用对象给对象初始化
stud2.display();
student stud3(2, "落小熙", 66); //调用带参数的构造函数
student stud4(3);
student* stud5 = new student(4, "萧琳儿", 68);//指针调用 堆内存:动态申请内存大小
delete stud5;
/* 对象数组的定义以及赋值 */
student stud[3] = //赋值的同时会调用重载的构造函数进行输出
{
student(5,"小李子",69),
student(6,"吴清源",70),
student(7,"李小二",71)
};
/* 指向对象成员函数的指针 */
void (student :: *ptr)(); //定义一个student类的函数的指针
ptr = &student::display; //把student类里的display函数的地址给ptr
(stud1.*ptr)(); //调用ptr所指向的成员函数
/* 常对象 */
student const stud6(8, "史蒂夫", 72);//在stud6的生命周期中,对象stud6的所有数据成员的值都不能更改
//this指针可以作为函数返回值,return *this;表示返回引用。
system("pause");
return 0;
}
运行结果
对象的赋值与复制
对象的赋值是对一个已经存在的对象赋值,
因此必须先定义被赋值的对象,才能进行赋值。而对象的复制则是从无到有地建立一个新的对象,并使它与一个已有的对象完全相同(包括对象的结构和成员的值)。
student stud=stud1; (对象的复制,无需定义stud1)
静态成员
以static开头 如果希望对象中的数据成员的值是一样的, 就可以把它定义为静态数据成员,这样它就为各对象所共有。
静态的数据成员在内存中只占一份内存空间(而不是每个对象都分别为它保留一份空间)。 int student::height = 10;
(公有的)静态数据成员可以初始化,但只能在类体外进行初始化。 数据类型 类名::静态数据成员名 = 初值;
不能用参数初始化表对静态数据成员初始化。
静态成员函数
静态成员函数是类的一部分而不是对象的一部分。
如果要在类外调用公用的静态成员函数,要用类名和域运算符“::”。
如: static int volume(); Box::volume();
静态成员函数没有this指针。
静态成员函数主要用来访问静态数据成员,而不访问非静态成员。
友元
友元函数 v
使用方法:在普通定义函数前加friend 友元函数可以访问这个类中的私有成员 友元类 不仅可以将一个函数声明为一个类的“朋友”,
友元类
而且可以将一个类(例如B类)声明为另一个类(例如A类)的“朋友”。 这时B类就是A类的友元类。友元类B中所有的函数都是A的友元函数,
可以访问A类中的所有成员。友元的关系是单向的,并且不能传递。