类,对象

类和对象: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)类似,一个对象通过成员选择符”.“来访问成员变量和成员函数,而指针变量通过指针操作符”->“来访问成员。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值