在C++中,结构体不仅可以定义变量时也可以定义函数。
一.类的引入
struct student
{
int _age;
char _name[20];
char _gender[3];
void init(int age, char* name, char* gender)
{
_age = age;
strcpy(_name, name);
strcpy(_gender, gender);
}
};
int main()
{
student s;
s.init(18, "张三", "男");
system("pause");
return 0;
}
同样的结构体C++中,将会用class代替struct;
二.类的定义
class student
{
//成员函数
//成员变量
};
类的两中定义方式:
1.声明和定义都在类体中
class student
{
public:
void init(int age, char* name, char* gender)
{
_age = age;
strcpy(_name, name);
strcpy(_gender, gender);
}
private:
int _age;
char _name[20];
char _gender[3];
};
2.声明放在.h文件中,定义放在.cpp文件中
三.类的访问限定符
三个限定符:public(公有),private(私有),protected(保护)
【访问限定符说明】
(1) public成员在类外可以直接访问;
(2)protected和private成员在类外(在此可将protected和private理解成private)不能够访问
(3)它们的作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
(4) class的体中如何没有定义限定符,则默认访问权限是private 5. struct为public型(因为struct要兼容C)
四.类的作用域
1.类定义了一个新的作用域,类的所有成员都必须处在类的作用域中。
2.在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。
3.在类的作用域外,只能够通过对象(或指针)借助成员访问操作符.和->来访问类成员
4.类中的成员在类中具有全局性。
namespace N1
{
int a = 10;
}
int a = 20;
class test
{
public:
void init(int a)
{
_a = a;
}
void print()
{
cout << _a << endl;
}
private:
int _a; //成员变量在类中具有全局作用
};域
int main()
{
cout << N1::a << endl; //10
cout << a << endl; //20
test b;
b.init(30);
b.print(); //30
test* c = &b;
c->init(40);
c->print(); //40
system("pause");
return 0;
}
五.类的实例化
用类类型创建对象的过程,就是类的实例化。
代码举例子:
class student
{
public:
void init(int age, char* name, char* gender)
{
_age = age;
strcpy(_name, name);
strcpy(_gender, gender);
}
void print()
{
cout << _name << _gender << _age << endl;
}
public:
int _age;
char *_name;
char *_gender;
};
void test()
{
student stu;
stu._age = 10;
stu._name = "张三";
stu._gender = "男";
}
六.类的大小的计算
1.类中有变量也有函数,那么如何表示出一个类的大小呢?
看代码:
class a1
{
public:
void test()
{
}
void test1()
{
}
private:
int _a;
};
class a2
{
void test()
{
}
void test1()
{
}
};
class a3
{
};
int main()
{
cout << sizeof(a1) << endl;
cout << sizeof(a2) << endl;
cout << sizeof(a3) << endl;
system("pause");
return 0;
}
根据代码显示的内容
类的大小其实就是类中成员函数之和,需要内存对齐。
结构体内存对齐的相关知识,点击链接:https://blog.csdn.net/oldwang1999/article/details/80460134
空类的大小为1.1.
2.类对象的存储模型
六.this指针
我们先写一个日期类:
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void print()
{
cout << _year << " " << _month << " " << _day << " " << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2018, 10, 26);
Date d2(d1);
Date d3 = d1;
d1.print();
d2.print();
d3.print();
system("pause");
return 0;
}
1. 每个成员函数都有一个指针形参,它的名字是固定的,称为this指针,this指针是隐式的。
2. 编译器会对成员函数进行处理,在对象调用成员函数时,对象地址作实参传递给成员函数的第一个形参this指 针。
3. this指针是成员函数隐含指针形参,是编译器自己处理的,我们不能在成员函数的形参中添加this指针的参数 定义,也不能在调用时 显示传递对象的地址给this指针。