起初刚学C++时,很不习惯用new,后来看老外的程序,发现几乎都是使用new,想一想区别也不是太大,但是在大一点的项目设计中,有时候不使用new的确会带来很多问题。当然这都是跟new的用法有关的。new创建类对象,使用完后需使用delete删除,跟申请内存类似。所以,new有时候又不太适合,比如在频繁调用场合,使用局部new类对象就不是个好选择,使用全局类对象或一个经过初始化的全局类指针似乎更加高效。
c++的类/对象
类,是一种特殊的自定义类型,在实例化为对象时,会自动对成员进行初始化
1.类/对象的一些特性
对象的创建细节
当一个类实例化为一个对象时,会为其中的成员分配内存空间(所有成员默认private)。其中,成员变量集中放在对象的内存中(就和结构体一样),而成员函数是同一个类的所有对象公用的,单独定义在代码段,并不以函数指针的形式放在对象的内存中,由编译器在编译时直接链接到调用处
然后编译器连它们的初始化都给包办了,自动进行赋值,编译器先执行初始化列表,再执行构造函数,来为成员变量赋初始值
所以可以认为,从同个类中实例化而来的对象,它们的成员函数实质是同一个函数(入口地址相同)。那么问题来了,众所周知,成员函数可以直接访问成员变量,但是从同个类中实例化而来的对象,其成员函数如何区分自己和别人的成员变量呢?答案是隐藏的参数“this”,this的本质是一个指向当前对象自己的指针
class Test
{
int mi;
public:
Test(int i){ /*成员函数中隐藏的参数this,Test(int i, this)*/
mi = i; /*实际执行的是this->mi = i;*/
};
};
int main()
{/*t1和t2是不同的对象,但同一个类,它们的构造函数Test(int i)实质是同一个函数,那么Test(int i)中如何确定mi是t1.mi还是t2.mi呢?*/
Test t1(1);
Test t2(2);
}1234567891011121314
成员变量的访问权限
类中的所有成员默认为private,而成员变量的访问权限一般都应设为private/protected
private权限范围是当前类(即可被当前类中的成员函数直接获取),protected权限范围是当前类和子类(即可被当前类和子类中的成员函数直接获取)。注意它们的范围是类,而不是对象
所以说,同一个类的不同对象,它们的成员函数是可以互相访问对方的成员变量的,一般用引用参数来实现:
class Test
{
int var;
public:
void Test(const Test &ori)
{
cout << ori.var << endl; //可用这种方式直接访问同类的成员变量
cout << var << endl; //对于自己的成员变量则可直接访问,这的var本质是this —> var
}
};
int main()
{
Test t1;
Test t2;
t1.test(t2);
return 0;
}12345678910111213141516171819
静态成员函数与成员变量
静态成员函数与成员变量,它们的性质很类似于普通函数与普通全局变量
通过前面代码不难得知,成员函数依赖于对象传入的参数“this”,所以只能以对象名.函数名()的形式来调用。如果没有实例化对象,是不能单独去调用成员函数的。如果我们实在要单独调用,则可以使用“静态成员函数”,只需用static修饰成员函数,就可以使它不依赖于对象而被单独调用,可以在任何地方以类名::函数来访问。但是这么做的代价就是,由于没有参数“this”,“静态成员函数”无法访问对象中的成员变量,只能去访问类中公用的成员变量,即“静态成员变量”
所谓“静态成员变量”,即使用static修饰成员变量,并将其在全局定义。它会被分配到全局数据区,生命周期为永久,所有的对象将共用这个成员变量(类似成员函数的共用)。“静态成员变量”和全局变量唯一不同的是,它可以是private的,相对于全局变量更加安全,同时更低耦合高聚态;但是如果设置为public,可以在任何地方以类名::变量名来访问,那就和全局变量没有任何区别了…..
C++的概念:例如我说“车”的时候,你想到了什么?是不是车子都可以开,都有轮子.那么你头脑中自然就想起了一个车子类(类是属性的集合,车子的属性:可以开,有重量,大小,颜色).但是我说:“你看,那辆车多漂亮!”当你顺着我指着的方向看去,这就是一个实际存在的对象—————具体的车子.综上所述,类是事物的抽象.类的对象就是类的具体化,实际化.有“人"这个类.如果我用 人:张三.那么我就用人这个类去建立了张三这个"人"的对象.