Person p=new Person(12);


在c++ 中有两种方式

Person p1(12);

Person *p2=new Person(12);


p1在方法结束后,就会消亡
p2在方法结束后,不会消亡,得手动删除
对p2的方法调用可以 p2->run();或者 (*p2).run();


string a="abc";  

bar(a); //ok


将数组交给指针

int a[5];

int *p = &a[0];

int *k = a;

二维数数组

int b[3][4];

int *p;

p=b[0];



c++函数中的变与不变


Person里面有个方法叫add,参数是Person p,那么对p的所有修改,不会影响真实的外部调用 这叫使用对象做函数参数(但是如果p很大的话,这种方式比较耗费资源)
Person里面有个方法叫add,参数是Person *p,那么对p的所有修改,会影响真实的外部调用  这叫使用指针做函数参数
Person里面有个方法叫add,参数是Person &p,那么对p的所有修改,会影响真实的外部调用 这叫使用引用做函数参数


如果又不想让p的修改影响外部,而且效率高,就把参数声明改成 const Person &p
这时 下面的代码都是错误的 
//使用对象做函数参数就不会影响外面的实参,所以meth1加const是没有什么意义的#

void meth1(const Person p) {  
Person k;
p.year = 15; //错误
p = k; //错误
}
void meth2(const Person &p) {
Person k;
p.year = 15; //错误
p = k; //错误
}
void meth3(const Person *p) {
Person k(2,2);
p = k; //错误
p.year = 12;//错误
}

同时 


const int a=10;
const int &b=a;
int &c=a; //不行 非常量指向一个常量是不行的


int i=42;
const int &b=i; //ok


int a = 10;
const int &b = a;
cout << b << endl;
a = 15;
cout << b << endl;


关于 引用与指针的初始化与使用


int k = 4158;
int k2 = 12;
int &p = k;
const int &m = 1234;
//int &m = 123; //引用的初始值必须是对象
p = k2;
&p = k2; //不行
&p = 123; //不行

int k = 12;
int s = 333;
int *m = &k;
int *h = 1234;//不行
int *h2 = k;//不行
int p = 11;
*m = p;
m = &s;
m = s;//不行
m = 123;//不行