前言
C++指针有很多地方和C语言共通的,所以会忽略很多C指针基础知识,这篇最好有C指针基础再来批判
int* p1,p2;看起来像声明了两个指针,其实不是,和int *p1,p2;等价
可以用typedef语句避免这个错误,例如
typedef int* intPointer
,然后intPointer p1,p2;
就声明了两个指针
可以对指使用比较运算符来确定指针的先后次序
常量指针
这个点见8.11号的做题,涉及到了
可以用const
关键字声明一个常量,同样也可以用这个关键字声明指针,用于“固定”指向的位置。
double radius = 5;
double* const p = &radius;
- p是常量,但p指向的数据不是常量,是可以改变的
如果把const
放在数据类型之前
const double* p = &radius
那么指向的就是常量了
当然如果两边都放
const double* const pValue = &radius
就是一个常量指针指向常量了
数组与指针
这一方面在C中已经很成熟了,那么就写一些容易混淆的
list[i]
与*(list+i)
等价,解引用比+优先,所以*(list+i)
与*list+i
情况不同- C++中数组名的实质是一个常量指针,是不能改变的
*p++
值为arr[0]
但是运行完后指向arr[1]
,*++p
是p先加一,再解引用,++*p
是先解引用再加一
函数内传指针与返回指针
对于
void f(int* p1,int* &p2){}//函数
f(q1,q2);//调用,q1,q2为指针
结果为:
- q1传值给p1,使得指向的内容都一致,再函数内直接更改内容,使得外部内容同样遭到更改。但若更改p1的指向,那么函数外的q1其实不受影响
- q2传引用给p2,所以q2是p2的别名,那么无论什么修改就会共同影响
函数返回指针:
这是一个用于反转数组的一个函数
int* reverse(int* list,int size){
for(int i = 0;j=size - 1;i<j;i++,j--){
int temp=list[j];
list[j]=list[i];
list[i]=temp;
}
return list;
}
数组函数API
min_element
,max_element
返回数组中最小、最大元素的指针
e.g. min_element(list,list+6)返回数组中list[0],list[5]之间最小元素的指针
sort
对数组进行排序random_shuffle
随机安排数组元素排序find
寻找匹配元素指针
this指针
this只能出现在类的内部,通过this可以访问类的所有成员,包括private内的。在对象创建后才有意义
#include <iostream>
using namespace std;
class Student{
public:
void setname(char *name);
void setage(int age);
void setscore(float score);
void show();
private:
char *name;
int age;
float score;
};
void Student::setname(char *name){
this->name = name;
}
void Student::setage(int age){
this->age = age;
}
void Student::setscore(float score){
this->score = score;
}
void Student::show(){
cout<<this->name<<"的年龄是"<<this->age<<",成绩是"<<this->score<<endl;
}
int main(){
Student *pstu = new Student;
pstu -> setname("李华");
pstu -> setage(16);
pstu -> setscore(96.5);
pstu -> show();
return 0;
}
其中发现,类中函数的形参与类中参数重名,这就是一种不得不使用this的情况
拷贝构造函数
拷贝构造函数可以用来创造一个对象,并用另一个对象的数据初始化新建对象
ClassName(const ClassName&)
和构造函数一样,C++会隐式提供一个缺省的拷贝构造函数(没有主动定义的情况下)。
如果新建一个新对象,将所有参数一个个复制过去,这个思路是和拷贝构造函数是一致的,不过拷贝构造函数会自动新建对象。
- 浅拷贝:上述两种拷贝方式都叫浅拷贝
对于指针参数来说,浅拷贝会将指针地址也拷贝过去,所以两个对象中的指针就同时指向一个地址了,这不是我们想要的
- 深拷贝:可以在拷贝构造函数中自定义