C++从开始到放弃第三天。
1.初步认识
C语言主要面向过程的,关注的是过程,分析出求解的问题的步骤,通过函数调用逐步完成。
C++是基于面向对象的,关注的是对象,讲一件事情拆分为不同的对象,靠对象之间的关系完成。
2.类的引入
C++中,结构体不仅可以定义变量,也可以定义函数。
3.类的定义
class Date
{
//类体:由成员函数和成员变量构成。
};//记得加分号
class为定义的关键字,Date为函数体的名字,{}为类的主体,记得最后加;
类中的元素称为类中的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法和类的成员函数。
类的定义方式:
1.全部放在类体中。
2.声明放在.h,定义放在.cpp。定义时要加上(函数名):: (变量/函数)来引出。
4.类的访问限定符及封装
1.封装方法
用类将对象的属性和方法结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
2.访问限定符
1.public
2.private
3.protected
说明
1.public修饰的成员在类外可以被访问
2.private和protected在类外不可以被直接访问
3.访问限定符的作用域从该访问符出现的位置延续到下个访问符出现的位置
4.class的默认为private,struct的默认为public
问题:C++中struct和class的区别是什么?
解答:C++需要兼容C语言,所以C++中struct可以当成结构体去使用。
另外C++中struct还可以用来定义类。 和class是定义类是一样的。
区别是struct的成员默认访问方式是public,class是struct的成员默认访问方式private。
5.类的作用域(次重点)
类定义了一个新的作用域,在类外想要定义成员,需要加上::作用域解析符指明成员属于哪个作用域。
例子
class Date
{
public:
void Print();
private:
int _year;
int _month;
int _day;
};
void Date::Print()
{
cout << "" << _year << endl;
}
6.类的实例化(次重点)
1.类只是一个模型,限定了类中有多少个东西,但是并没有分配空间来存储他们。
2.一个类可以实例出多个对象。
3.不能再私密空间里直接定义类的成员的值。
例如:
class Date
{
public:
void Print()
{
cout << _year << "-" << _month << "-" << _day;
}
public:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
d1._year = 2019;
d1._month = 1;
d1._day = 16;
d1.Print();
system("pause");
return 0;
}
7.类对象模型(重点)
class A1
{
public:
void f1()
{}
private:
int _a;
};
class A2
{
public:
void f2()
{}
};
class A3
{};
sizoef(A1) = (4) ; sizeof(A2) = (1); sizoef(A3) = (1)
结论
一个类的大小,实际就是该类中“成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类的大小为1,用来占用空间,表示空类存在。
8.this指针(今天的重点)
class Date
{
public:
void Print()
{
cout << _year << "-" << _month << "-" << _day;
}
void SetDate(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
Date d2;
d1.SetDate(2019.1.6);
d1.Print();
d2.SetDate(2019.1.7);
d2.Print();
system("pause");
return 0;
}
函数是如何在函数体中区分,是d1调用的结构体的成员函数,还是d2调用的结构体中的成员函数呢?
C++是通过this指针来实现该问题。C++编译器给每个成员函数增加了一个隐藏的指针参数,让该指针指向当前对象,在函数中指向某个参数,都是通过该指针访问。只不过这个操作在编程时是看不见的。
函数特性
1.this指针的类型:类型名称(类的名称)const*
2.只能在成员函数内使用
3.this函数本质上是该函数的实参,在对象调用函数时,将对象的地址作为实参传给this。
4.this指针是一个隐藏的指针,一般编译器通过寄存器进行转载,不需要客户声明定义。
this的实际存在形式: