首先写个例子
#include<iostream>
#include<string>
using namespace std;
int age = 10;
namespace one {
void fun1() {
cout << "one" << endl;
}
}
namespace two{ //命名空间不同可避免函数名相同时冲突
void fun1() {
cout << "two" << endl;
}
namespace three {
void fun2() {
cout << "three" << endl;
}
}
}
struct Too {
private:
int age;
string name;
char sex[13];
public:
Too();
~Too();
Too(int a);
void Get_Name();
const char *Get_Sex();
};
Too::Too() {
cout << "Too" << endl;
}
Too::~Too() {
cout << "~Too" << endl;
}
Too::Too(int a):name("Lisa") {
char* p = sex;
p = "Man";
//age = a;
::age = 60;
}
void Too::Get_Name() {
cout << "name:" << name << endl;
}
const char* Too::Get_Sex() {
return sex;
}
int main() {
Too A(0),C;
//A(0);
Too B = C;
two::fun1();
//A.age = 111;
//char *p = A.Get_Sex();
char *p = (char*)A.Get_Sex();
p = "333";
A.Get_Sex();
cout << "age:" << age << endl;
return 0;
}
构造函数可以有多个但是析构函数只能有一个,所以,当你有多个构造函数时,在初始化赋值时一定要注意通用性。例如,如若你的两个构造函数中一个开辟了char*p = new char;另外一个则是char *p = new char[3],你怎么用一个析构函数兼容呢?
构造函数和析构函数可以放在private下吗?不可以,因为系统是自动调用他们的,如果放在私有下面,系统则不能调用它们自然也会报错。
这里我觉得最有趣的就是常说的const。它常常用于保护被修饰的东西,防止意外的修改来增强程序的健壮性,但是有的时候即使修饰你需要保护的东西为const类型当想要改变是也是可以改变的。比如上图的sex,虽然获取方式为const指针,但是如果把它强制转化,也是可以修改的。
对于命名空间的使用,之前我是完全没有注意的,但是后来我才发现,它的用处其实很大,当很多人一起合作时,你的程序很可能和其他人的函数名称一样,怎么有效的避免呢?它是个很好的解决办法,同时它还支持嵌套操作,使程序更加清晰。
浅拷贝和深拷贝,浅拷贝很方便,直接对对象赋值就可以了,但是当出现指针时,它们也会指向同一块内存,会有意外的错误发生。如上程序,B = C,当在赋值完毕以后,如若我改变C的个别值,那么B的值也会发生改变,如果只图方便就会带来意想不到的结果。同时如若调用析构函数,对一个地址同时析构两次也会出现错误。
浅意上说define 和 const 都是定义一个数,在以下的函数中,const只有一份拷贝,但是define却有很多份,在一定程度上,const减少了内存的消耗。
全局变量和和局部变量,在结构中,定义的变量都是有范围的,当你在结构的函数中改变一个变量,而这个变量在结构体外部也有时,它会选择结构体内部的。但是这样是不是就说明它不能改变结构体外部的值呢?不是,如果在相同变量名前加上::就可以改变全局变量了。上面的程序输出就是全局变量,在结构体的函数中已经把它的值变为了60.
const 放的位置不一样,代表的意思也有区别,当它放在函数的前面时,代表的是返回类型为常量,但是如果放在函数名称的后方,表示的意思就是造作的对象是常量类型,函数不会对其做出改变。
结构名也可以作为像其他类型一样在函数中传递,但是,当结构体很大时,直接传递结构体名称会浪费大量的空间,效率会非常低,所以当要传递时,可以直接传递指针或者引用。
这里没有加静态成员变量,static.如果在结构体内部定义成员变量static,该结构体不需要实例化便可以对其赋值,只需要在前面加上结构体的作用域就可以了。另外注意的是static普通变量的初始化要在函数的外部。
注意程序的重定义问题,当用到头文件时,如果在头文件中出现定义某值,多个头文件出现穿插调用,以至在一个cpp文件中出现多次调用一个头文件问题或者重定义问题时,可利用#ifdef #else #endif 或者 #ifndef #define #endif ,当定义一个变量时最好定义在cpp文件中,防止重定义。
最后就是指针问题了,当开辟了一个新的指针时,用完后要对其进行销毁,同时赋值为null,以方便之后的使用。当程序用到对应字符串的大小赋值时,一定要考虑到开辟的新的内存的大小是否足够,以满足不同长度的需求。