类和对象:class
是C++中的关键字,用于声明一个类;紧接 class 关键字之后的是我们自定义的类名 Student;由{ }
包围的是类体。声明类时不能对成员变量进行初始化,只有在创建对象以后才能赋值。
基本结构:
class Student{ private: //类包含的变量 char *name; int age; float score; public: //类包含的函数 void say(){ printf("%s的年龄是 %d,成绩是 %f\n", name, age, score); } };
1:在定义类的时候不能对成员变量赋值,因为类只是一种数据类型,本身不占用内存空间,而变量的值则需要内存来存储。
2:类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是:成员函数是一个类的成员,出现在类体中,它的作用范围由类来决定(可以访问私有成员变量);而普通函数是独立的,作用范围是全局的,如果不加以定义,则无法访问私有成员。
3:::
被称为域解析符(也称作用域运算符或作用域限定符),用来连接类名和函数名,指明当前函数属于哪个类。
在类体中直接定义函数时,不需要在函数名前面加上类名
4:成员函数必须先在类体中作声明,然后在类外定义,也就是说类体的位置应在函数定义之前,否则编译时会出错。
关于类内函数的定义:
class Student{
private:
char *name;
int age;
float score;
public:
void say(); //函数声明
};
//函数定义
void Student::say(){
printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
}
5:类可以理解为一种新的数据类型,该数据类型的名称是 Student。与 char、int、float 等基本数据类型不同的是,Student 是一种复杂数据类型,可以包含基本类型,而且多了很多基本类型中没有的特性。
需要注意的是:在类声明的最后有一个分号(;),它是类声明的一部分,表示类声明结束了,不能省略
虽然成员函数在类的外部定义,但在调用时会根据在类中声明的函数原型找到函数的定义(函数代码),从而执行该函数。
特殊的函数: 如果在域解析符“::”的前面没有类名,或者函数名前面既无类名又无域解析符“::”
则表示 say() 函数不属于任何类,这个函数不是成员函数,而是全局函数,即非成员函数的一般普通函数。(不可访问私有成员变量和函数)
例如:void say(){
}
//无类名 ::say( ){ //TODO } //无类名也无域解析符 say( ){ //TODO }
创建对象:①:只有 public 后面的成员变量和成员函数才能被创建的对象访问到,private里面的成员变量和函数不能访问,需要间接访问,通过调用public里面的函数,利用传参的形式,对私有成员进行访问
②:没有使用 public,那么创建对象后就不能使用任何成员。
1:声明了 Student 数据类型之后,就可以用它来定义变量了,如:
Student LiLei; //创建对象
2:在定义类的对象时,class 关键字可要可不要。但出于习惯我们通常都会省略掉class关键字,例如:
class Student LiLei; //正确
Student LiLei; //同样正确
创建类的对象时,除了能定义单个变量以外,还可以定义一个数组或者指针。例如:
Student all[100]; 第一条语句定义了一个 all数组,该数据拥有100个元素,每个元素都是 Student 类型
Student *p; 第二条语句定义了一个 Student 类型的指针 *p,该指针可以指向 Student 类型的变量(对象),用法和普通指针一样。
3:声明类的同时创建对象
和结构体(struct)类似 ,你可以先声明类,然后再创建对象,也可以在声明类的同时创建对象。如下所示:class Student{
//成员变量
char *name;
int age;
float score;
//成员函数
void say(){
printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
}
}stu1, stu2;
这个时候你也可以省略类名,直接创建对象。如下所示:
class{
//成员变量
char *name;
int age;
float score;
//成员函数
void say(){
printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
}
}stu1, stu2;
例子:①单个变量对象
#include <iostream>
using namespace std; (注意这个分号)
//类可以在所有函数之外定义
class Student{
private: //类包含的变量
char *name;
int age;
float score;
public: //类包含的函数
void say(){
printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
}
};
int main(){
//创建对象
Student stu;
stu.name = "小明";
stu.age = 15;
stu.score = 92.5f;
stu.say();
return 0;
}
②对象指针
//定义指针
Student *p = &stu;
p->name = "李雷";
p->age = 16;
p->score = 80;
p->say();
注意
:对象指针指向的是一个具体的对象,而不是类。下面的写法是错误的:
Student *p;
p = &Student;
可以看出:
可以发现,和结构体(struct)类似,一个对象通过成员选择符”.“来访问成员变量和成员函数,而指针变量通过指针操作符”->“来访问成员。