类与对象初识
1.类的引入
C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。
struct Student
{
void SetStudentInfo(const char* name, const char* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void PrintStudentInfo()
{
cout << _name << " " << _gender << " " << _age << endl;
}
char _name[20];
char _gender[3];
int _age;
};
int main()
{
Student s;
s.SetStudentInfo("Peter", "男", 18);
return 0;
}
2.类的定义
class Student
{
public:
//称为成员函数
void SetStudentInfo(const char* name, const char* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void PrintStudentInfo()
{
cout << _name << " " << _gender << " " << _age << endl;
}
private:
//成员变量或类的属性
char _name[20];
char _gender[3];
int _age;
};
int main()
{
Student s;
//1.类成员的使用,不需要通过作用域限定符的方式使用
//2.通过.的形式如果是指针通过->的形式
s.SetStudentInfo("Peter", "男", 18);
return 0;
}
3.访问限定符
//访问限定符
public//公有
protected//保护
private//私有
访问修饰符说明
1.访问权限修饰符只限制成员在类外的访问权限,在类内部成员之后可以相互访问
2.不受访问修饰符的限制
3.访问修饰符的作用域:从修饰符开始,到下一个修饰符结束
4. public修饰的成员在类外可以直接被访问, protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
C++和class的区别
区别是struct的成员默认访问方式是public,class是struct的成员默认访问方式
是private。
例如下面程序
#include<iostream>
using namespace std;
struct A
{
int _ra;
};
class B
{
int _rb;
};
void test()
{
A a;
a._ra;//在结构体中访问方式为public,可以访问_ra
B b;
b._rb;//在类中默认为访问方式private,不可以访问_rb
}
int main()
{
test();
return 0;
}
4.类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。
class Person
{
public:
void PrintPersonInfo();
private:
char _name[20];
char _gender[3];
int _age;
};
//成员函数的类外定义
// 这里需要指定PrintPersonInfo是属于Person这个类域,通过作用域::类外定义
void Person::PrintPersonInfo()
{
cout<<_name<<" "_gender<<" "<<_age<<endl;
}
5.类的实例化
用类类型创建对象的过程,称为类的实例化
- 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
- 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
- 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什
么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
class A
{
public:
int _pa;
};
void test()
{
//定义一个类类型的变量称为类的实例化
//实例化的变量称为类的对象
A oa;//oa是A的实例化对象
}
6.计算类对象的大小
#include<iostream>
using namespace std;
class A
{
public:
int a;
};
class B
{
//成员函数不占对象的空间
public:
int fun1(int a, int b)
{
return a + b;
}
public:
int _a;
};
class C
{
public:
int fun1(int a, int b)
{
return a + b;
}
//C中不含成员变量,大小类似于空类的大小
};
class D{};
void test()
{
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
cout << sizeof(D) << endl;
}
int main()
{
test();
return 0;
}
需要注意两点:
1.类中的成员函数不占对象的空间
2.空类也占一个字节的大小