类
一种抽象数据类型:具有共同属性(数据结构)和行为(操作/函数)的对象的集合
class 类名{ public://可类外访问 公有数据成员; 公有成员函数;//具体定义在类体外实现 protected://类及h其派生类可访问 保护数据成员; 保护成员函数; private://只能类内访问 私有数据成员; 私有成员函数; };类的成员:
- 数据成员
- 成员函数(一般定义在类体外实现)
成员函数的定义:
//类内 数据类型 函数名(参数类型 (参数名)){ }//参数名可有可无 //类体外实现 数据类型 类名::函数名(){ } //内联函数定义 //隐式声明 数据类型 函数名(参数类型 (参数名)){ }//参数名可有可无 //显示声明 inline 数据类型 函数名(参数类型 (参数名)){ }//参数名可有可无 //类外 inline 数据类型 类名::函数名(){ }访问权限关键字:
- public
- protected
- privacy
没有一个访问权限关键字,类的成员默认私有
举个例子:输入半径和高求圆柱体体积
#include <iostream> #include <cmath> using namespace std; const double PI=3.14; class Cylinder{//圆柱体类 private: double radius,height; public: void setRadiusAndHeight(double r,double h){ radius=r; height=h; } double getRadius(){ return radius; } double getHeight(){ return height; } double getVolume(){ return radius*radius*PI*height; } }; int main() { cout<<"请输入圆柱体的半径和高:"<<endl; double r,h; cin>>r>>h; //圆柱体体积 Cylinder test1; test1.setRadiusAndHeight(r,h);//设置半径和高 cout<<"半径为"<<test1.getRadius()<<"高为"<<test1.getHeight()<<"的圆柱体体积为:"<<test1.getVolume()<<endl; return 0; }运行结果:
对象
类的实例
对象的定义:
1.声明的同时,定义对象(s1,s2)
class Student{ ... }s1,s2;2.先声明,再在主函数(main函数)定义(创建)对象(s1,s2)
class Student{ ... }; ... int main() { Student s1,s2; ... }访问成员:
访问数据成员:对象名.数据成员名
访问成员函数:对象名.成员函数名(参数表)
#include <iostream> #include <string> // string头文件 using namespace std; class Student{ private: string name; string id; public: void setName(const string &name); void setId(const string &id); string getName() const; string getId() const; }; void Student::setName(const string &name){ this->name = name; } void Student::setId(const string &id){ this->id = id; } string Student::getName() const{ return name; } string Student::getId() const{ return id; } int main(){ Student s1; s1.setName("六六八八");//访问成员函数 s1.setId("2026666888"); cout << "s1的名字为:" << s1.getName() << endl; cout << "s1的学号为:" << s1.getId() << endl; return 0; }构造函数
无参:类名();
含参:类名(参数表);
构造函数实现:初始化数据成员
Student::Student(const string &name,const string &id)
: name(name), id(id)
{
}注:此处使用成员初始化列表对成员数据初始化(下面详述)
#include <iostream> #include <string> using namespace std; class Student{ private: string name; string id; public: Student(const string &name,const string &id);//含参构造函数 void setName(const string &name); void setId(const string &id); string getName() const; string getId() const; }; Student::Student(const string &name,const string &id) : name(name), id(id) { } void Student::setName(const string &name){ this->name = name; } void Student::setId(const string &id){ this->id = id; } string Student::getName() const{ return name; } string Student::getId() const{ return id; } int main(){ Student s1("六六八八","2026666888"); cout << "s1的名字为:" << s1.getName() << endl; cout << "s1的学号为:" << s1.getId() << endl; return 0; }成员初始化列表
一个例子解释三个要点:
定位到下列代码类Six的构造函数(第五行),结合具体代码分析:
#include <iostream> using namespace std; class Six{ public: Six(int a):apple(a),baby(apple),cat(10),dad(cat+1){ } void print(){ cout<<"apple:"<<apple<<" baby:"<<baby<<" cat:"<<cat<<" dad:"<<dad<<endl; } private: int apple,dad; int& baby; const int cat; }; int main(){ Six s(6); s.print(); return 0; }运行结果:
要点一:
初始化列表形式:类名(参数列表):成员数据名1(参数),成员数据名2(参数),...
要点二:
特殊成员数据初始化:
只能使用初始化列表初始化,不能在函数体内进行赋值操作
- 常量(有const 修饰) ->常量只读,在初始化后不能赋值,所以不能直接在构造函数赋值
const int cat;这里cat 为常量,cat(10)即为使用初始化列表进行初始化,所以运行结果为10
- 引用类型->初始化时绑定被引用变量,初始化后不能再赋值
int& baby;和baby(apple)这里设定baby是apple的引用(上篇有详细说明)C++学习记02:引用
https://blog.csdn.net/m0_67023197/article/details/167812017?spm=1011.2124.3001.6209
使用初始化列表进行初始化,baby和apple值相同,apple先与baby声明,apple初始化为a且a=6
因此,baby运行结果为6
要点三:
是否有疑惑为什么dad运行结果会是1,不应该是11吗???
这是因为类成员是按照被声明顺序进行初始化的,与初始化列表呈现顺序无关
在上述代码中,dad先与cat声明,那么当cat未初始化时,dad又是以cat+1的值来初始化的,所以dad是随机值,而不是11