一、
引用 和用
指针
在
c++函数中,形式参数用 引用 和用 指针都可以起到在被调用函数中改变调用函数的变量的作用。什么时候用引用作参数什么时候用指针作参数呢 void function (int *ptr); void function(int &ref);
没有 特定的规定。。 学的 久了,就 会习惯什么时候用
指针什么时候用
引用了
引用与
指针有什么区别? 1)
引用必须被初始化,
指针不必。 2)
引用初始化以后不能被改变,
指针可以改变所指的对象。 2) 不存在指向空值的
引用,但是存在指向空值的
指针。
C++中尽量用
引用。 个人觉得所有的
引用都可以用
指针,但
指针比
引用容易出错。
引用当然更直观更直接,做参数时,如果在函数内不刻意要用
指针的那些副作用(如越界访问,动态定向什么的),
引用可以代替
指针。
C++ 中一般都用
引用就可以了 ... C 中没有
引用,就使用
指针 ....
举例如下:
1 使用指针传递参数时: void function (int *ptr) { 函数体;} 调用该函数时 main() { int p; function (&p); } 2 使用引用传递参数时: void function(int &ref) { 函数体;} 调用该函数时 main() { int p; function (p); } 由此可见,使用引用比使用指针传递参数函数调用时更简单,引用和指针功能大体相同,但是有空间分配时建议最好使用指针,因为在释放空间时,对指针只需要delete就行了,而引用是不能删除空间的,引用必须指向一个存在的对象。
指针和
引用的差别 1. 非空的差别任何情况下都不能使用指向空值的
引用.一个
引用必须总是指向某个对象. 不存在的指向空值的
引用这个事实意味着使用
引用的代码效率比使用
指针要高. 2. 合法性区别在使用
引用之前不需要测试他的合法性.
指针必须测试. 3. 可修改区别
指针可以被重新赋值给另一个不同的对象.但是
引用总是指向在初始化的时候被制定的对象,以后不能改变.但是指定的对象其内容可以改变. 应该使用
指针的情况: 可能存在不指向任何对象的可能性 需要在不同的时刻指向不同的对象(此时,你能够改变
指针的指向) 应该使用
引用的情况: 如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,使用此时应使用
引用。
要首先好好理解
指针和
引用的区别
指针与 引用看上去完全不同( 指针用操作符’*’和’->’, 引用使用操作符’.’),但是它们似乎有相同的功能。 指针与 引用都是让你间接 引用其他对象。你如何决定在什么时候使用 指针,在什么时候使用 引用呢?
首先,要认识到在任何情况下都不能用指向空值的 引用。一个 引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为 指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为 引用。
“但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”
char *pc = 0; // 设置 指针为空值
char& rc = *pc; // 让 引用指向空值
这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用 引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个 引用指向空值的可能性。
因为 引用肯定会指向一个对象,在C里, 引用应被初始化。
string& rs; // 错误, 引用必须被初始化
string s("xyzzy");
string& rs = s; // 正确,rs指向s
指针没有这样的限制。
string *ps; // 未初始化的 指针
// 合法但危险
不存在指向空值的 引用这个事实意味着使用 引用的代码效率比使用 指针的要高。因为在使用 引用之前不需要测试它的合法性。
void printDouble(const double& rd)
{
cout << rd; // 不需要测试rd,它
} // 肯定指向一个double值
相反, 指针则应该总是被测试,防止其为空:
void printDouble(const double *pd)
{
if (pd)
{// 检查是否为NULL
cout << *pd;
}
}
指针与 引用的另一个重要的不同是 指针可以被重新赋值以指向另一个不同的对象。但是 引用则总是指向在初始化时被指定的对象,以后不能改变。
string s1("Nancy");
string s2("Clancy");
string& rs = s1; // rs 引用 s1
string *ps = &s1; // ps 指向 s1
rs = s2; // rs 仍旧 引用s1
// 但是 s1的值现在是"Clancy"
ps = &s2; // ps 现在指向 s2;// s1 没有改变
总的来说,在以下情况下你应该使用 指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置 指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变 指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用 引用。
还有一种情况,就是当你重载某个操作符时,你应该使用 引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。
vector<int> v(10); //建立整形向量(vector),大小为10
//向量是一个在标准C库中的一个模板
v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值
如果操作符[]返回一个 指针,那么后一个语句就得这样写:
*v[5] = 10;
但是这样会使得v看上去象是一个向量 指针。因此你会选择让操作符返回一个 引用
当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用 指针。而在除此之外的其他情况下,则应使用 指针 。
指针与 引用看上去完全不同( 指针用操作符’*’和’->’, 引用使用操作符’.’),但是它们似乎有相同的功能。 指针与 引用都是让你间接 引用其他对象。你如何决定在什么时候使用 指针,在什么时候使用 引用呢?
首先,要认识到在任何情况下都不能用指向空值的 引用。一个 引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为 指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为 引用。
“但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”
char *pc = 0; // 设置 指针为空值
char& rc = *pc; // 让 引用指向空值
这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用 引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个 引用指向空值的可能性。
因为 引用肯定会指向一个对象,在C里, 引用应被初始化。
string& rs; // 错误, 引用必须被初始化
string s("xyzzy");
string& rs = s; // 正确,rs指向s
指针没有这样的限制。
string *ps; // 未初始化的 指针
// 合法但危险
不存在指向空值的 引用这个事实意味着使用 引用的代码效率比使用 指针的要高。因为在使用 引用之前不需要测试它的合法性。
void printDouble(const double& rd)
{
cout << rd; // 不需要测试rd,它
} // 肯定指向一个double值
相反, 指针则应该总是被测试,防止其为空:
void printDouble(const double *pd)
{
if (pd)
{// 检查是否为NULL
cout << *pd;
}
}
指针与 引用的另一个重要的不同是 指针可以被重新赋值以指向另一个不同的对象。但是 引用则总是指向在初始化时被指定的对象,以后不能改变。
string s1("Nancy");
string s2("Clancy");
string& rs = s1; // rs 引用 s1
string *ps = &s1; // ps 指向 s1
rs = s2; // rs 仍旧 引用s1
// 但是 s1的值现在是"Clancy"
ps = &s2; // ps 现在指向 s2;// s1 没有改变
总的来说,在以下情况下你应该使用 指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置 指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变 指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用 引用。
还有一种情况,就是当你重载某个操作符时,你应该使用 引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。
vector<int> v(10); //建立整形向量(vector),大小为10
//向量是一个在标准C库中的一个模板
v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值
如果操作符[]返回一个 指针,那么后一个语句就得这样写:
*v[5] = 10;
但是这样会使得v看上去象是一个向量 指针。因此你会选择让操作符返回一个 引用
当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用 指针。而在除此之外的其他情况下,则应使用 指针 。
指针与
引用看上去完全不同(
指针用操作符“*”和“->”,
引用使用操作符“. ”)
二、
sizeof() strlen();
Char str[] = “hello world”;
sizeof()为
12 strlen()为11
三、
const
const float pi=3.1415926;
也可以这样写
float const pi=3.1415926;
也可以这样写
float const pi=3.1415926;
而对于指针
const在指针的左边或右边有不同的含义,
const在指针左边表示所指的东西
是常量,例如: const char * str或者这么写char const都是表示foo是不能改变的,不能对其改变内容 *str="foo";="foo";
是常量,例如: const char * str或者这么写char const都是表示foo是不能改变的,不能对其改变内容 *str="foo";="foo";
const在*右边的情况,这种情况表示指针不允许改变,例如:
char * const这样被我限制了,不可以的。
这时编译会出现,assignment of read-only variable `str,看连指针本身都不能改变了。' str="foo";
str="XIXI"; //haha
char * const这样被我限制了,不可以的。
这时编译会出现,assignment of read-only variable `str,看连指针本身都不能改变了。' str="foo";
str="XIXI"; //haha
四、
const
static
const 说明它是个值不能改变的常量
static说明它是个静态变量:如果在函数内,在类里面,则函数的每一个实例,类的每一个对象,都共享这同一个变量。如果是全局量,则说明在其他文件编译的时候,它是不可见的(可以避免名字命名的冲突)。
static说明它是个静态变量:如果在函数内,在类里面,则函数的每一个实例,类的每一个对象,都共享这同一个变量。如果是全局量,则说明在其他文件编译的时候,它是不可见的(可以避免名字命名的冲突)。
static const int i = 100; 或
const 永远不变
static 能保存变化
static 能保存变化
static const
和
const static
有啥区别?如何初始化类中的这种类型的变量
没有区别。
一个是静态常量,
一个是常量静态,
静态都将存储在全局变量区域,其实最后结果都是一样的。
可能在不同编译器内,不同处理,但是最后结果是一样的。
一个是静态常量,
一个是常量静态,
静态都将存储在全局变量区域,其实最后结果都是一样的。
可能在不同编译器内,不同处理,但是最后结果是一样的。