namespace tangsan {
int age = 20;
char * level = "唐三是封号斗罗";
void show() {
cout << "level:" << level << ", age:" << age << endl;
}
void doAction() {
cout << "唐三 在嘉陵关大战比比东" << endl;
}
}
//这样使用是全局属性 全局可用
using namespace tangsan;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//局部可用
using namespace tangsan;
show();
return a.exec();
}
使用命名空间可以直接调用命名空间内部的函数。
class Student {
public:
Student() {
cout << "空参数构造函数" << endl;
}
// 先调用两个参数的,再调用一个的
Student(char *name) :Student(name, 87) {
cout << "一个参数的构造函数" << endl;
this->name = name;
}
// :name(name) 等价 this->name = name;
/*Student(char * name) :name(name) {
cout << "一个参数的构造函数" << endl;
}*/
// 两个参数的构造函数
Student(char *name, int age) {
//浅拷贝
// this->name = name;
// 堆区深拷贝
this->name = (char *) (malloc(sizeof(char *) * 10));
strcpy(this->name, name);
this->age = age;
cout << "两个参数的构造函数" << endl;
}
// 析构函数 Student对象的,Student对象被回收了,你做一些释放工作
// delete stu 的时候,我们的析构函数一定执行
// free不会执行析构函数,也意味着,你没法在析构函数里面,做释放工作, malloc也不会调用构造函数
~Student() {
cout << "析构函数" << endl;
// 必须释放 堆区开辟的成员
if (this->name) {
free(this->name);
this->name = nullptr; // 执行NULL的地址,避免出现悬空指针
}
}
class Douluo{
// 私有属性
public:
char *name;
int level;
public:
Douluo() { cout << "空参数构造函数" << endl; }
// 两个参数的构造函数
Douluo(char *name, int level) : name(name), level(level) {
cout << "两个参数构造函数" << endl;
}
// ~Student(char * name) { } 这样写,就不是析构函数了
~Douluo(){
cout<<"析构函数"<name=douluo.name;
this->level=douluo.level-10;
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//在栈区申请的内存
Douluo douluo = { "唐三",100};
//将一个对象赋值给另外一个对象 会触发拷贝构造函数
Douluo douluo2=douluo; //会执行拷贝构造函数 需要自己去赋值,否则没数据
// Douluo douluo2; //会执行空参数构造函数
// douluo2=douluo; //这样不会执行拷贝构造函数 但是会默认赋值
//执行了拷贝构造函数 两个对象的地址不一样
cout << "main douluo=" << &douluo << endl;
cout << "main douluo2=" << &douluo2 << endl;
cout << "main douluo2=" << douluo2.name <<" level="<level=99; //“->”调用一级指针的成员
cout << "main douluo4=" << douluo4->name <<" level="<level<< endl;
cout << "main douluo3=" << douluo3->name <<" level="<level<< endl;
return a.exec();
}
自定义拷贝构造函数:只需要在空参构造函数的基础上,传入常量引用就可以了。添加const的意义是为了提升性能,否则传入参数会再拷贝一份,如果添加const就不会再进行拷贝了。
Douluo douluo2=douluo:这个操作会触发拷贝构造函数,需要自己去赋值,否则没数据。
Douluo douluo2 douluo2=douluo:但是先声明再赋值就不会触发构造函数,会自动赋值。
如果通过new的方式初始化的指针类型,是不会触发拷贝构造函数的。
“->”调用一级指针的成员