类和对象总结
类和对象
在C中 “数据”和“处理数据的操作(函数)”是分开的,语言本身并没有支持“数据和函数”之间的关联性
在C语言结构体中不能定义函数,但是在C++中可以在结构体中定义函数
例子:
struct student
{
char _name[20];
char _sex[5];
int _age;
void students(const char* name, char* sex, int age)
{
strcpy(_name, name);
strcpy(_sex, sex);
_age = age;
}
};
int main()
{
student s;
s.students("路飞", "男", 18);
return 0;
}
类的定义:
class name{};
定义类的关键字,class name为类的名字 , {}中是类的主体,注意类定义结束时后面是分号
类中的元素称为类的成员,类中的数据称为类的属性或者类的成员变量,类中的函数称为类的成员函数
类的定义通常为两种
1.类的声明放在.h文件中,类的定义放在.cpp中。
2.类的声明和定义都放在类体中
C++三大特性之一:封装
封装概念:隐藏对象的属性和实现细节,仅对外公开接口和对象进行交换,将数据和操作数据的方法进行有机结合
访问限定符有三种:public(共有),private(私有),protected(保护)
解释:1.public: 可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象访问
2.private: 只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问.
3. protected: 可以被该类中的函数、子类的函数、以及其友元函数访问,但不能被该类的对象访问
(和private的唯一区别就是,protected可以被子类函数访问)
注:友元函数包括两种:设为友元的全局函数,设为友元类中的成员函数
注意:1.它们的作用域从访问限定符出现的位置开始直到下一个访问限定符出现为止
2.访问限定符只在编译时有用,当数据映射到内存,没有任何访问限定符的区别
类的作用域包括:局部域、全局域、类域、名字空间域
类定义一个新的作用域,类的所有成员都必须在类的作用域中,形参表和函数体处于类的作用域中。
在类外定义成员,需要使用(::)作用域解析符指明成员属于哪个类域。在类的作用域外,只能
通过对象(或指针)借助成员访问操作符(.)和(->)来访问类成员,跟在访问操作符后面的名字必须在
相关联的作用域中
namespace X //名字空间中的a
{
int a = 1;
}
int a = 2; //全局域中的a
class test
{
public:
void set(int y) //类中的set函数
{
a = y;
}
void print()
{
cout << a << endl;
}
private:
int a;
};
int main()
{
test t;
t.set(3);
cout << X::a << endl;
cout << a << endl;
t.print();
system("pause");
return 0;
}
注意:全局变量在类中具有全局作用域
类的实例化:用类类型创建对象的过程称为类的实例化
一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量
类和对象的区别:类和对象的区别:类就相当于图纸,对象相当于房子,类不占空间,对象是实体
类的对象模型:类中各成员在内存中的布局形式
class Student
{
public:
void SetStudentInfo(char* name, char* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void PrintInfo()
{
cout << _name << " " << _gender << " " << _age << endl;
}
private:
char _name[20];
char _gender[3];
int _age;
};
int main()
{
Student s1, s2;
s1.SetStudentInfo("孙悟空", "男", 18);
s2.SetStudentInfo("唐僧", "男", 18);
s1.PrintInfo();
s2.PrintInfo();
return 0;
}
一个类有那么多成员和不同的对象,那么它到底是怎么来存储的呢?
是这样的:
如何计算一个类的大小?
// 类中既有成员变量,又有成员函数
class A1
{
public:
void f1()
{}
void f2()
{}
private:
int _a;
};
// 类中仅有成员函数
class A2
{
public:
void f1()
{}
void f2()
{}
};
// 类中什么都没有 --- 空类
class A3
{};
int main()
{
cout << sizeof(A1) << endl;
cout << sizeof(A2) << endl;
cout << sizeof(A3) << endl;
system("pause");
return 0;
}
有成员变量的时候得到的值是4,而一个只有成员函数和空类的时候它的值是1 ,成员函数是不占大小的
结论:一个类的大小,就是该类中非静态成员变量之和,当然也要注意内存对齐,空类大小值为一(在Linux和VS下面是 1)
为什么是一呢?
为了区分不同的对象,设计 1 是为了 节省空间
面试题:
C语言和C++中struct的区别?C++中struct和class的区别?
class有默认的private权限, struct有默认的public权限,因为struct要兼容C,在C++工程中struct里面可以放函数
如何在类外访问一个类中私有的成员变量?
在公有的里面定义一个函数访问私有的成员,友元(friend)
上一篇: Unity 常用的事件类型及其用法和线程
下一篇: php中如何去掉文件后缀