C++类和对象 ——上
文章目录
面向过程和面向对象的初步认识
-
C语言是面向过程的,通过分析求解的步骤,通过函数一步一步解决问题
-
C++是基于面向对象的,通过将一件事拆分成不同的对象,靠对象之间交互完成
举例:
C语言在这里就需要自己去动手建造房主
每一步都是自己来
而C++就相当于自己买房房子
对象就是自己、房子、中间商
类的介绍
类的引入
//A:
typedef struct STList
{
int val;
struct STList* next;
}STL;
//把结构体升级成类
class STList
{
int val;
STList* next;
};
//B:这里的_year变量为什么可以识别?
struct Date
{
void Init(int year)//自定义函数
{
_year = year;
}
int _year;
};
-
B的变量可以被识别是因为类是一个整体
-
结构体在C++中更喜欢用class来代替
-
C语言结构体中只能定义变量
-
在C++中,结构体内不仅可以定义变量,也可以定义函数。
比如:现在上面的B段代码
类的定义:
class className
{
//类体
};
-
class是关键字 ,className是类名,{}中为类体,跟C语言中的结构体格式一样
-
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者
成员函数。
1.类的两种定义方式
- 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
class P1
{
void showinfo
{
cout<<_name<<endl;
}
char*_name;
};
- 类声明放在.h文件中,成员函数定义放在 .cpp 文件中,注意:成员函数名前需要加类名 ::
//P1.h文件中
class P1
{
void showinfo
{
cout<<_name<<endl;
}
char*_name;
};
//P1.cpp
#include"P1.h"
void Person::showinfo
{
cout<<_name<<endl;
}
这两种方法都可行,作者本人推荐第二种
2.类里面的形参域成员变量以及访问权限
class Date
{
public:
void Init(int size)
{
// 这里的size到底是成员变量,还是函数形参?
_size = size;
}
private:
int _size;
};
//通常都是加 _ 到成员变量的最前或者最后
int _size;
//这样就不会混淆了
【访问限定符说明】
- public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. 如果后面没有访问限定符,作用域就到 } 即类结束。
5. class的默认访问权限为private,struct为public
问题:C++中的struct和class有什么区别?
解答:区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。struct和class在C++里定义都是一样的。
类的作用域
class P1
{
public:
void printP1info();
private:
char _name[20];
};
//访问printP1info
void P1::printP1info()
{
cout << _name << endl;
}
类的作用域外调用类作用域里的函数时需要加 ::
类的实例化
介绍:用类类型创建对象的过程,称为类的实例化
- 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没
有分配实际的内存空间来存储它。
2.一个类可以实例化出很多对象,实例化出的对象 占用实际的物理空间,存储类成员变量
class P1
{
public:
void days(int month, int day)
{
_month = month;
_day = day;
cout << _month << "." << _day << endl;
}
private:
int _month; //声明
int _day;
};
int main()
{
//错误实例化:
P1 d1=10;
//正确实例化
P1 d1;
return 0;
}
总结:实例化 ——用设计图建造房主
类对象实例化 ——开空间
类和对象模型
1.计算对象的大小
//《考虑内存对齐》
// 类中既有成员变量,又有成员函数
class A1 {
public:
void f1() {}
private:
int _a;
};
// 类中仅有成员函数
class A2 {
public:
void f2() {}
};
// 类中什么都没有---空类
class A3
{};
//没有成员的类大小是1,1字节就是要占位
为什么成员变量是在对象当中,成员变量不在对象中?
1.每个对象成员调用是不一样的,需要独立存储
2.每个对象调用的函数是一样的
关键字this(详解)
1.this指针的特性
- this指针的类型:*const,在成员函数中不能给this指针赋值。
- 只能在成员函数里使用
- this指针本质上是成员函数的形参,对象中不存储this指针
- this指针是成员函数第一个隐含的指针形参,在栈上,编译器自动传递。
2.隐含指针
3.this指针的使用说明
class P1
{
public:
void Init(/*Date*this,*/int year, int month, int day)//注释掉的是隐含指针(现实不能这么写)
{
//this可以单独对变量加 **也可以不加this**
this->_year = year;
this->_month = month;
this->_day = day;
}
private:
int _year;//没开空间就是声明
int _month;
int _day;
};
空指针问题:
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void fun()
{
cout << "day" << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
Date d2;
//空指针调用
Date* ptr = nullptr;
//ptr->fun(); //正常运行 A
//ptr->Init(2023, 3, 14); //运行崩溃 B
//ptr->_year; //运行崩溃 C
//(*ptr).fun(); //正常运行 D
//fun(); E
//如果单调用就不行,因为函数在对象域,内域限制
return 0;
}
总结:-> * 都是表面的,需要看传过去之后的this,要不要对类成员解引用,如果需要就崩溃。