c++认为万事万物皆为对象,对象有其属性和行为;
具有相同属性和行为的对象可以成为类;
封装是类和对象的三大特性之一,封装的意义在于把属性和行为作为一个整体,表现生活中的事物和蒋属性和行为加以权限控制
语法:class+类名(person ~~){访public~~):属性/行为};
for example
class person{
public:
int age;
int high;
void set(int x,int y)
{age=x;high=y;}
}:这里就创建了一个简单的类,它的名称是person ,age ,high ,set是它的属性和行为。
访问权限有三种:1.public 公共权限;
2.protected 保护权限;
3.private 私有权限;
第一种权限权限无论在类内类外都可以访问它,后两种权限只有在类内才可以访问。
如下面所示:
class Cube
{
public:
int getm_l()
{
return m_l;
}
protected:
void setm_l(int l)
{
m_l = l;
}
private:
int m_l;
};
这里创建了一个Cube的类,这里的getm_l函数我们可以在类外引用,也可以在类内;
setm_l函数我们只能在这个类内进行访问,否则就会报错,同理m_l我们也只能在类内进行访问。
在c++中定意类通常有两种方式一种是class,一种是struct;这两种有一些差别
class中它的默认权限是私有权限,在你不加任何权限限制的情况下,它的默认权限是私有权限;
struct中它的默认权限是公有权限。
这些权限设置都有它的意义,私有权限可以保护类的成员不被随意更改。
在我们编写一个类时我们通常会在多处地方调用这个类,而且类的成员太多时,我们的代码也会显得臃杂,我们这时候可以编写头文件使得,类的成员名称和操作分离出来。
对象的初始化和清理
为什么要对对象进行初始化和清理呢?一个对象或者是变量没有初始状态,对其使用后果是未知的,可能会引起一些错误,c++利用构造函数和析构函数来解决这个问题,这两个函数会被编译器自动调用。对象的初始化和清理是编译器强制要求做的事情,所以我们就算不提供构造函数和析构函数,编译器会 给我们提供两个空实现的函数。
构造函数和析构函数
构造函数主要作用于创建对象时i为对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用;
析构函数主要作用于对象的销毁,在对象销毁前自动调用,执行一些清理工作。
构造函数的创建只需要类名加上括号.
析构函数的创建则在类名前多加一个~。
构造函数的分类和调用方式
按参数分类:有参构造,无参构造
按类型分类:普通构造和拷贝构造(不是拷贝构造函数其他都为普通构造)
创建拷贝函数时要在类名前加一个const
class person{
public:
person()
{cout<<"无参构造函数调用"<<endl;}
person(int a)
{cout<<"有参构造函数调用"<<endl;}
person(const person&p)
{cout<<"拷贝构造函数调用"<<endl;}
};
这里创建了三个构造函数,,每种构造函数都有它的特点。
调用方式:
括号法
class person{
public:
person()
{cout<<"无参构造函数调用"<<endl;}
person(int a)
{cout<<"有参构造函数调用"<<endl;}
person(const person&p)
{cout<<"拷贝构造函数调用"<<endl;}
};
void test1()
{
person p1;
person p2(10);
person p3(p2);
}
以上就是括号法的使用,特别注意就是我们在用无参构造函数时不需要加括号,加上括号编译器会误以为我们创建了一个函数。
显示法:
沿用上面的person类
void test2()
{
person p1;
person p2=person(10);//匿名对象
person p3=person(p2);
//这里的person(10)和person(p2)称为匿名对象,它们在使用完后会被立即销毁。
//注意不要用拷贝构造函数来初始化一个匿名对象,例如person(p3),这里编译器会以为你输入的是person p3,会与上面造成对象重命名。
}
隐式转换法
继续沿用上面的person 类
void test ()
{
person p1=10;//有参构造
person p2=p1;//拷贝构造
}
以上就是三种常用的构造函数调用法。