数组的定义和初始化
静态 int array[100]; //定义了数组,但是未进行初始化
静态 int array[100]={1,2}; //定义并初始化了数组,除前两个其余为默认值0
动态 int* array = new int[100]; 分配了长度为100的数组
动态 int* array = new int[100](1,2); 为长度为100的数组array初始化前两个元素
字符串
C风格字符串
C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。
下面的声明和初始化创建了一个 RUNOOB 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 RUNOOB 的字符数多一个。
char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
依据数组初始化规则,您可以把上面的语句写成以下语句:
char site[] = "RUNOOB";
C++ 中的 String 类
#include <string>
string str = "runoob";
指针
&var 表示取var的地址
*var 访问指针中地址的值
#include <iostream>
using namespace std;
int main ()
{
int var = 20; // 实际变量的声明
int *ip; // 指针变量的声明
ip = &var; // 在指针变量中存储 var 的地址
cout << "Value of var variable: ";
cout << var << endl;
// 输出在指针变量中存储的地址
cout << "Address stored in ip variable: ";
cout << ip << endl;
// 访问指针中地址的值
cout << "Value of *ip variable: ";
cout << *ip << endl;
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20
指针和引用
引用:为对象起了另外一个名字。必须初始化。引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起。引用不是对象,没有实际地址,所以不能定义指向引用的指针。
指针:与引用一样,可以实现对其他对象的间接访问。不同点:a.指针本身是一个对象,允许对指针赋值和拷贝,指针在其生命周期内可以先后指向不同的对象。b.指针无须再定义时赋初值。
Const
顶层const:表示指针本身是一个常量,更一般的,顶层const可以表示任意的对象是常量(不限于指针)
底层const:表示指针所指对象是一个常量(限指针和引用等复合类型)
int *const p1 = &i; //从右往左看,p是一个常量,指向一个整型,可称为常量指针,是一个顶层const
const int *p2 = &ci; //从右往左看,p2是一个指针,指向一个const int也即常量,可称为指针常量(同int const *p2)是一个低层const
const int ci = 42; //顶层const
const成员函数(P231)
默认情况下,this的类型非常量的常量指针,如:Sales_data * const this
但是,我们不能将this绑定到一个常量对象上:
即 this = &常量对象 是不行的,因为常量对象的值不能够更改,而this指向对象的值是可修改的,这样会出大问题。
因此,要在一个常量对象上调用普通的成员函数是不行的,我们使用常量成员函数。func(...) const{。。。}类型,const用来表明this的类型是const Sales_data * const this this是一个指向常量对象的常量指针,所指对象的值及this本身的值(地址)都不能修改。
总结:常量成员函数 (const member function), 可读取类中的数据成员,但不能修改。
问题
int main(){
int i=0;
const int cp = i;
cout<<cp<<endl;
i=1;
cout<<cp<<endl;
return 0;
}
//输出 0 0 因为用i的值来初始化了常量cp,后续i的值改变对cp没有影响
int main(){
int i=0;
const int * cp = &i;
cout<<*cp<<endl;
i=1;
cout<<*cp<<endl;
return 0;
}
//输出 0 1 指针的话,cp指向i的地址,i的值改变会引起cp的值改变
int main(){
int i=0;
const int &cp = i;
cout<<cp<<endl;
i=1;
cout<<cp<<endl;
return 0;
}
//输出 0 1 cp是i的别名
2.数组作为函数形参
void func1(const int is[10]){
for(int i=0;i!=10;i++){
cout<<is[i]<<endl;
}
}
void func2(const int (&is)[10]){
for(int i=0;i!=10;i++){
cout<<is[i]<<endl;
}
}
int main(){
int a[] = {1,1,1,1,1,1,1,1,1,1,3};
func1(a);//正确,
func2(a);//错误,类型不匹配,只能接收长度为10的数组
return 0;
}
3.返回
评论区