C++中的结构体和类

C++中的结构体和类

结构体(struct)

定义

结构体(struct) 是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。

C语言中struct定义了一组变量的集合,C编译器并不认为这是一种新的类型。

1
2
3
4
5
6
7
8
9
struct Teacher{
char names[32];
int age;
};

void main() {
Teacher t1; //这是错误的
struct Teacher t1; //这是正确的
}

C++语言中struct是一种新类型的定义声明,进行了类型加强

1
2
3
4
5
6
7
8
struct Teacher{
char names[32];
int age;
};

void main() {
Teacher t1;
}

定义和初始化

定义
  1. 先声明结构体类型再初始化变量
1
2
3
4
5
6
7
8
9
10
11
12
13
//结构体的声明
struct Student{
char name[32];
int age;
int score;
};

int main() {
Student stu1, stu2; //结构体变量的初始化
cout << sizeof(stu1) << endl;
cout << sizeof(stu2) << endl;
return 0;
}
  1. 在声明结构体类型的同时初始化变量
1
2
3
4
5
6
7
8
9
10
11
int main() {
//结构体的声明
struct Student{
char name[32];
int age;
int score;
} stu1, stu2; //结构体变量的初始化
cout << sizeof(stu1) << endl;
cout << sizeof(stu2) << endl;
return 0;
}
  1. 直接定义结构体变量
1
2
3
4
5
6
7
8
9
10
11
int main() {
//结构体的声明
struct {
char name[32];
int age;
int score;
} stu1, stu2; //结构体变量的初始化
cout << sizeof(stu1) << endl;
cout << sizeof(stu2) << endl;
return 0;
}

注: 虽然这几种定义方式都可以,但是最常用的是第一种方法

结构体类型需要注意的几点:

  1. 只能对结构体变量中的成员赋值,而不能对结构体类型赋值。

  2. 对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于同类型的普通变量。

  3. 结构体的成员也可以是一个结构体变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//结构体的声明
struct Date{
int year;
int mounth;
int day;
};

struct Student{
char name[32];
int age;
int score;
Date birthday; //Date是结构体类型,birthday是Date的类型的变量
};

int main() {
Student stu; //结构体变量的初始化
Date date;
cout << sizeof(stu) << endl;
cout << sizeof(date) << endl;
return 0;
}
  1. 结构体中的成员名可以与程序中的变量名相同,但二者没有关系。
初始化
  1. 在定义结构体时对结构体变量指定初始值
1
2
3
4
5
6
7
8
9
struct Student{
char name[32];
int age;
int score;
} stu1{
'li',
18,
80
};
  1. 在定义变量时进行初始化(这种方法更常用)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Student{
char name[32];
int age;
int score;
};

int main(int argc, char const *argv[]) {
Student stu1{
'li',
18,
80
};
return 0;
}

结构体变量的引用

在定义了结构体变量之后,就可以引用这个变量。

  1. 引用结构体变量中的一个成员的值

    引用方式:结构体变量名.成员名,其中“.”是成员运算符,它在所有的运算符中优先级最高。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    struct Date{
    int year;
    int mounth;
    int day;
    };

    struct Student{
    char name[32];
    int age;
    int score;
    Date birthday; //Date是结构体类型,birthday是Date的类型的变量
    };

    int main() {
    Student stu = {"li", 18, 100, 1993, 10, 1}; //结构体变量的初始化
    cout << stu.name << endl;
    cout << stu.age << endl;
    cout << stu.score << endl;
    cout<<stu.birthday.year<<"/"<<stu.birthday.mounth<<"/"<<stu.birthday.day << endl;
    return 0;
    }

    如果一个成员本身也是一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员。

    比如:

    1
    cout<<stu.birthday.year<<"/"<<stu.birthday.mounth<<"/"<<stu.birthday.day << endl;
  2. 可以将一个结构体变量的值付给另外一个具有相同结构的结构体变量。

  3. 可以引用结构体变量的地址,也可以引用结构体变量成员的地址。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    struct Date{
    int year;
    int mounth;
    int day;
    };

    struct Student{
    char name[32];
    int age;
    int score;
    Date birthday; //Date是结构体类型,birthday是Date的类型的变量
    };

    int main() {
    Student stu1 = {"li", 18, 100, 1993, 10, 1}; //结构体变量的初始化
    Student &stu2=stu1;
    stu2.age++;
    stu2.birthday.day+=10;
    cout << stu2.name << endl;
    cout << stu2.age << endl;
    cout << stu2.score << endl;
    cout<<stu2.birthday.year<<"/"<<stu2.birthday.mounth<<"/"<<stu2.birthday.day << endl;
    return 0;
    }

类(class)

定义

类(class) 是一种数据类型,该类型类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的一个集合。

1
2
3
4
5
6
7
8
9
class student
{
char name[20]; //姓名
int id_num; //学号
int age; //年龄
char sex; //性别
void set_age(int a);
int get_age();
};

定义和初始化

定义
  1. 定义一个类
1
2
3
4
5
6
7
8
9
//类的声明
class Student{
char name[20]; //姓名
int id_num; //学号
int age; //年龄
char sex; //性别
void set_age(int a);
int get_age();
};

其中成员变量:name、id_num、age、sex;成员函数:set_age(int a)、get_age();

有两种方法可以给出成员函数的定义:

  1. 内联定义(inline)

在类内部进行函数的声明和定义,此种方式我们成为inline。inline是C++关键字,专门用于表示内联;

1
2
3
4
5
6
7
8
9
class student
{
char name[20]; //姓名
int id_num; //学号
int age; //年龄
char sex; //性别
void set_age(int a){age = a;}
int get_age(){return age;}
};
  1. 在类内进行函数声明,在类外部进行函数定义。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class student
{
char name[20]; //姓名
int id_num; //学号
int age; //年龄
char sex; //性别
void set_age(int a);
int get_age()const;
};

//在类外部定义set_age函数
void student::set_age(int a)
{
age = a;
}

//在类外部定义get_age函数
int student::get_age() const
{
return age;
}
  1. 在类内声明函数,如果在函数声明时使用inline关键字,如例4所示,则可以将类内声明类外定义的函数强制转换为内联函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class student
{
char name[20]; //姓名
int id_num; //学号
int age; //年龄
char sex; //性别
inline void set_age(int a);
inline int get_age();
};
//在类外部定义set_age函数
void student::set_age(int a)
{
age = a;
}
//在类外部定义get_age函数
int student::get_age()
{
return age;
}

区别

C++语言继承了C语言的struct,并且加以扩充。在C语言中struct是只能定义数据成员,而不能定义成员函数的。而在C++中,struct类似于class,在其中既可以定义数据成员,又可以定义成员函数。

在C++中,struct与class基本是通用的,唯一不同的是如果使用class关键字,类中定义的成员变量或成员函数默认都是private属性的,而采用struct关键字,结构体中定义的成员变量或成员函数默认都是public属性的。

在C++中,没有抛弃C语言中的struct关键字,其意义就在于给C语言程序开发人员有一个归属感,并且能让C++编译器兼容以前用C语言开发出来的项目。