四 创建对象两种方式 :普通创建 + 对象指针
(1)普通创建
class Student Stu; //正确
Student Stu; //同样正确
除了创建单个对象,还可以创建对象数组:
Student allStu[66];
该语句创建了一个 allStu 数组,它拥有66个元素,每个元素都是 Student 类型的对象。
(2)对象指针
I栈
Student stu; Student *pStu = &stu;
创建的对象 stu 在栈上分配内存,需要使用&获取它的地址,
II堆
Student *pStu = new Student;
也可以在堆上创建对象,这个时候就需要使用new关键字
(3)例子
(4)总结
使用对象指针
C语言中经典的指针在 C++ 中仍然广泛使用,尤其是指向对象的指针,没有它就不能实现某些功能。
两种创建对象的方式:
一种是在栈上创建,形式和定义普通变量类似;
另外一种是在堆上创建,必须要用一个指针指向它,记得 delete 掉不再使用的对象。
五 类的成员变量和成员函数
类 数据类型 含有属性和方法
类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。类 不占内存; 变量 占内存; 不可在定义类的时候对成员变量赋值。
-在定义类的时候不能对成员变量赋值,因为类只是一种数据类型或者说是一种模板,本身不占用内存空间,而变量的值则需要内存来存储。类 方法 使用范围
-类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是:成员函数是一个类的成员,出现在类体中,它的作用范围由类来决定;而普通函数是独立的,作用范围是全局的,或位于某个命名空间内。
六访问权限
这种将成员变量声明为 private、将部分成员函数声明为 public 的做法体现了类的封装性。所谓封装,是指尽量隐藏类的内部实现,只向用户提供有用的成员函数。
(1)
public、private、protected 只能修饰类的成员,不能修饰类,C++中的类没有共有私有之分。
在类的内部(定义类的代码内部),无论成员被声明为 public、protected 还是 private,都是可以互相访问的,没有访问权限的限制。
(2)
private:
类中的成员变量 m_name、m_age 和m_ score 被设置成 private 属性,在类的外部不能通过对象访问。也就是说,私有成员变量和成员函数只能在类内部使用,在类外都是无效的。(成员变量大都以m_开头,这是约定成俗的写法,不是语法规定的内容。以m_开头既可以一眼看出这是成员变量,又可以和成员函数中的形参名字区分开。)
public:成员函数 setname()、setage() 和 setscore() 被设置为 public 属性,是公有的,可以通过对象访问。
protected:类的成员被保护,可以被该类的成员函数和该类的派生类的成员函数访问,但是不能被其定义的类变量直接访问。即,它是私有的。
(4)
private:
关键字的作用在于更好地隐藏类的内部实现,该向外暴露的接口(能通过对象访问的成员)都声明为 public,不希望外部知道、或者只在类内部使用的、或者对外部没有影响的成员,都建议声明为 private。
七 类的封装
(1)private 关键字的作用在于更好地隐藏类的内部实现,该向外暴露的接口(能通过对象访问的成员)都声明为 public,不希望外部知道、或者只在类内部使用的、或者对外部没有影响的成员,都建议声明为 private。
(2)根据C++软件设计规范,实际项目开发中的成员变量以及只在类内部使用的成员函数(只被成员函数调用的成员函数)都建议声明为 private,而只将允许通过对象调用的成员函数声明为 public。
(3)我们可以额外添加两个 public 属性的成员函数,一个用来设置成员变量的值,一个用来修改成员变量的值。上面的代码中,setname()、setage()、setscore() 函数就用来设置成员变量的值;如果希望获取成员变量的值,可以再添加三个函数 getname()、getage()、getscore()。
给成员变量赋值的函数通常称为 set 函数,它的名字通常以set开头,后跟成员变量的名字;读取成员变量的值的函数通常称为 get 函数,它的名字通常以get开头,后跟成员变量的名字。
除了 set 函数和 get 函数,在创建对象时还可以调用构造函数来初始化各个成员变量。不过构造函数只能给成员变量赋值一次,以后再修改还得借助 set 函数。
这种将成员变量声明为 private、将部分成员函数声明为 public 的做法体现了类的封装性。所谓封装,是指尽量隐藏类的内部实现,只向用户提供有用的成员函数。
(4)对声明为 private 的成员和声明为 public 的成员的次序任意,既可以先出现 private 部分,也可以先出现 public 部分。如果既不写 private 也不写 public,就默认为 private。
- Note:
(1)
在栈上创建出来的对象都有一个名字,比如 stu,使用指针指向它不是必须的。
但是通过 new 创建出来的对象就不一样了,它在堆上分配内存,没有名字,只能得到一个指向它的指针,所以必须使用一个指针变量来接收这个指针,否则以后再也无法找到这个对象了,更没有办法使用它。
也就是说,使用 new 在堆上创建出来的对象是匿名的,没法直接使用,必须要用一个指针指向它,再借助指针来访问它的成员变量或成员函数。
(2)
栈内存是程序自动管理的,不能使用 delete 删除在栈上创建的对象;
堆内存由程序员管理,对象使用完毕后可以通过 delete 删除。
在实际开发中,new 和 delete 往往成对出现,以保证及时删除不再使用的对象,防止无用内存堆积而造成内存泄漏这种现象。
delete释放内存后,指针值不变,良好的风格是释放后指针置为NULL,如,delete p; p = NULL。
(3)Differences: malloc,free; new,delete.
malloc,free是C/C++的标准库函数。
new,delete是c++的操作符。malloc申请的是内存,严格意义不是“对象”。
new申请的可以理解为“对象”,new 时会调用构造函数,返回指向该对象的指针。
(4):: 的作用 :就是当局部变量和全局变量名字重叠的时候,指定某变量一定是来自全局变量。同时,当成员函数定义在类外时,就必须在函数名前面加上类名予以限定。(这一条作用不大 因为成员函数直接定义在类里面就好了 干嘛定义在类外面多此一举呢!)