一、类与对象。
1. 与结构体一样,类只是一种复杂类型的数据声明,不占用内存空间。而对象是这种数据类型的一个变量,所以占用内存空间。
一个类的定义示例。
class Student{
public:
//成员变量
char *name;
int age;
float score;
//成员函数
void say(){
cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
}
};
(这里与java不同,java是在外部加public 关键字,而C++是在内部,只能在内部声明)
2.我们平时创建的对象都是在栈里,这样的对象都有名字,比如sut(),使用指针指向他不是必须的。但是通过new创建的对象在队里,没有名字,只能通过一个指针指向它。否则以后就找不到这个对象了。
栈内存是自动管理的,不能使用delete删除在栈上创建的对象;对内存由程序员管理,对象使用完毕后可以通过delete删除。在实际开发中,new和delete往往成对出现,以保证及时删除不再使用的对象,防止无用的内存堆积。
1.在栈里创建对象:
Student stu;
Student *pStu = &stu;
2.在堆里创建对象:
Student *pStu = new Student;
二、成员变量和成员函数。
与java的成员函数必须在类内定义不同的是,C++的成员函数可以在类内定义,也可以现在类内声明,然后在类外定义。区别在于,在类内定义的成员函数自动解析为内联函数。而类外定义的成员函数则不是内联函数。
一般用非内联函数的形式定义。
1.成员函数作为内联函数定义法:
class Student{
public:
//成员变量
char *name;
int age;
float score;
//成员函数
void say(){
cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
}
};
2.成员函数不是内联函数的定义法:
class Student{
public:
//成员变量
char *name;
int age;
float score;
//成员函数
void say(); //函数声明
};
//函数定义
void Student::say(){
cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
}
三、类成员的访问权限以及类的封装。
注意:C++中,只有成员变量和成员函数由公有私有之分,类本身没有公有私有之分。这点于java不同。
1.C++的成员变量大都以m_开头,便于于成员函数的形参名字区分开。
private和protected修饰的属性的成员在类外无法访问,只有pubilc修饰的成员在类外可访问。不写时默认为iprivate.
C++ 的构造函数位于类外。
#include <iostream>
using namespace std;
class Student{
private:
char *m_name;
int m_age;
float m_score;
public:
//声明构造函数
Student(char *name, int age, float score);
//声明普通成员函数
void show();
};
//定义构造函数
Student::Student(char *name, int age, float score){
m_name = name;
m_age = age;
m_score = score;
}
//定义普通成员函数
void Student::show(){
cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
}
int main(){
//创建对象时向构造函数传参
Student stu("小明", 15, 92.5f);
stu.show();
//创建对象时向构造函数传参
Student *pstu = new Student("李华", 16, 96);
pstu -> show();
return 0;
}
在栈上创建对象时,实参位于对象名后面,例如Student stu("小明", 15, 92.5f)
;
在堆上创建对象时,实参位于类名后面,例如new Student("李华", 16, 96)
。
一旦定义了构造函数,那么创建对象时就一定要调用,不调用是错误的。如果由多个重载的构造函数,那么创建对象时提供的实参必须和其中的一个构造函数匹配。