cpp02:类和对象
一.类和结构体的区别:
二者都是自定义变量。c语言结构体里面只能定义变量,cpp类可以定义变量和函数。cppj兼容c语言的stuct结构体。
class Date {
public:void Init(int year, int month, int day) {_year = year;_month = month;_day = day;}private:int _year; // 成员变量加前缀 _ 区分int _month;int _day;
};int main()
{Date d;d.Init(2024, 7, 9);return 0;
}
二.访问限定符
protected,private:在类外不能被访问。
public:在类外可以被访问。
(直到继承章节才能有区别)
class没有给访问限定符,默认是private。struct默认为public。
三.struct和类的自引用用于定义链表节点
//1.C语言中用法
struct LsitNodeC
{int val;//数据域struct ListNodeC* next;//指针域 结构体需要加struct关键字 ListNode才能表示结构体类型 //,又因为是指针,所以指向结构体
};typedef struct LsitNodeC
{int val;//数据域struct ListNodeC* next;//指针域 结构体需要加struct关键字 ListNode才能表示结构体类型 //,又因为是指针,所以指向结构体
}LN;//2.CPP中用法
//CPP兼容C的struct用法,同时在cpp里把struct升级成了类
stuct LsitNodeCPP
{int val;//数据域ListNodeCPP* next;
};class LsitNodeCPP
{int val;//数据域ListNodeCPP* next;
};
四.函数定义在类的内部/外面的区别:
函数定义在类的内部:
但inline也只是对编译器的建议,当函数很长的时候不会被采用。
struct Date
{// public: // C++ 默认 public,可省略void Init(int year, int month, int day) {_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;
};
函数定义在类的外面:
需要进行声明和定义的分离。
struct Date
{public:void Init(int year, int month, int day);private:int _year;int _month;int _day;
};//声明
//错误写法:因为变量使用时候需要寻找其定义,void Init是全局函数,只会在全局里面找。
而在CPP中{}表示域,此处为类域,会造成函数无法找到_year _month _day的定义。void Init(int year, int month, int day)
{_year = year;_month = month;_day= day;
}//正确写法:指定Init不是全局函数,是Date类域里的成员函数。
则此时编译器除了在全局里面找,还会在Date类域里面找
void Date::Init(int year, int month, int day)
{_year = year;_month = month;_day= day;
}
五.类域
四个域:
同一个域不能定义同名变量,不同的域可以定义同名变量。
类域和命名空间域,只影响名字隔离,不影响生命周期。
域是编译时候的概念,编译时候任何一个变量或者函数,会去找他的出处(即声明/定义),若不指定类域,则全局变量只会在全局里面找;局部变量会先在局部(比如说这个函数)里面找,再去全局找,找不到就报错。指定了类域才会去类域里面找。
六.类的实例化
声明:不开空间,只是给出模板(成员,函数)。
定义==实例化:开辟空间,实例化对象。