std const &
来源:互联网 发布:百度知道营销软件 编辑:程序博客网 时间:2024/06/07 19:08
std是一个类(输入输出标准),包含了cin成员和cout成员,一般来说要先写上 using namespace std;后才能正常的使用他的成员。
这里又不得不提到namespace(命名空间或者叫名称空间),传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越拥挤,每个人都可能使用相同的名字来实现不同的库,于是程序员在合并程序的时候就会可能出现名字的冲突。namespace引入了复杂性,解决了这个问题。namespace允许像类,对象,函数聚集在一个名字下。本质上讲namespace是对全局作用域的细分。
#include <iostream>using namespace std;namespace first{ int var = 5;}namespace second{ double var = 3.1416;}int main () { cout << first::var << endl; cout << second::var << endl; return 0;}
最关键的一点就是可以进行:两个全局变量都是名字都是var,但是他们不在同一个namespace中所以没有冲突。
关键字using可以帮助从namespace中引入名字到当前的声明区域
#include <iostream>using namespace std;namespace first{ int x = 5; int y = 10;}namespace second{ double x = 3.1416; double y = 2.7183;}int main () { using first::x; using second::y; cout << x << endl; cout << y << endl; cout << first::y << endl; cout << second::x << endl; return 0;}
输出是52.7183103.1416就如我们所指定的第一个x是first::x,y是second.y但是浏览了知乎的文章发现说,能不要直接用整个namespace就不用整个,但是又有人提出抗议说那规模庞大的项目期待能写几千个std::,最后浏览了多个人的说法,就是在头文件内部千万不要using namespace。举例:就是引诱有一堆自以为很牛逼的人,爱写max min swap move forward 这样的“单谓词”函数名。很容易,这些牛逼的命名和std名字空间有冲突。推荐咱们自己的函数(不是类的成员函数)命名,最好使用谓语+宾语规则。如果怕和std有冲突,要么是谓语和宾语加分隔符,要么定义大写命名规范。class 成员 加上const 或者 & 有什么特别作用吗?不加引用的话,str则被复制一份,函数中对str的操作实质上是对其复制品的操作,所以即使在函数中修改了str,调用层的原str并不会被改变。加了引用的话,传入的str即是调用层的实际参数,这样省却了复制过程,效率会有提高。但如果函数中修改了str,则原str也会改变,因为其实是同一个东西。有时候为了追求效率,又希望避免改变原来的str,则可在引用的基础上加const修饰,这样函数中就不能再修改str的内容(否则会编译出错)。关于& 和 const 的作用std::string str,str可以被修改,而且会调用拷贝构造函数,这个时候即便修改也是修改副本std::sring& str,str可以被修改,但不会调用拷贝构造函数,修改的则是实参本身const std::string str ,str不能被修改,但会调用拷贝构造函数。const std::string& str,str不能被修改,而且也不会调用拷贝构造函数。但是有一个比较特殊的情况就是使用数组在做形参的时候:会被弱化为指针也就是在使用数组的时候 进行的是传址而不是传值举例:C++数组作为函数参数的几个问题
转之:http://blog.csdn.net/tanghw/article/details/6554538
本文需要解决C++中关于数组的2个问题:
1. 数组作为函数参数,传值还是传址?
2. 函数参数中的数组元素个数能否确定?
先看下面的代码。
#include <iostream>
using
namespace
std;
void
testArrayArg(
int
a[])
{
cout << endl;
cout <<
"in func..."
<< endl;
cout <<
"array address: "
<< a << endl;
cout <<
"array size: "
<<
sizeof
(a) << endl;
cout <<
"array element count: "
<<
sizeof
(a) /
sizeof
(a[0]) << endl;
cout <<
"changing the 4th element's value to 10."
<< endl;
a[3] = 10;
}
int
main()
{
int
a[] = {1, 2, 3, 4, 5};
cout <<
"in main..."
<< endl;
cout <<
"array address: "
<< a << endl;
cout <<
"array size: "
<<
sizeof
(a) << endl;
cout <<
"array element count: "
<<
sizeof
(a) /
sizeof
(a[0]) << endl;
testArrayArg(a);
cout << endl <<
"the 4th element's value: "
<< a[3] << endl;
return
0;
}
运行结果如下:
in main…
array address: 0012FF4C
array size: 20
array element count: 5
in func…
array address: 0012FF4C
array size: 4
array element count: 1
changing the 4th element’s value to 10.
the 4th element’s value: 10
当我们直接将数组a作为参数调用testArrayArg()时,实参与形参的地址均是0012FF4C。并且,在testArrayArg()中将a[3]的值修改为10后,返回main()函数中,a[3]的值也已经改变。这些都说明C++中数组作为函数参数是传址。
特别需要注意的是,在main()中,数组的大小是可以确定的。
array size: 20
array element count: 5
但作为函数参数传递后,其大小信息丢失,只剩下数组中第一个元素的信息。
array size: 4
array element count: 1
这是因为C++实际上是将数组作为指针来传递,而该指针指向数组的第一个元素。至于后面数组在哪里结束,C++的函数传递机制并不负责。
上面的特性可总结为,数组仅在定义其的域范围内可确定大小。
void
testArrayArg2(
int
a[],
int
arrayLength)
{
cout << endl <<
"the last element in array is: "
<< a[arrayLength - 1] << endl;
}
可在main()中这样调用:
testArrayArg2(a, sizeof(a) / sizeof(a[0]));
这样,testArrayArg2()中便可安全地访问数组元素了。
因此,如果在接受数组参数的函数中访问数组的各个元素,需在定义数组的域范围将数组大小作为另一辅助参数传递。则有另一函数定义如下:
- std const &
- std::__stl_throw_length_error(char const*)
- bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)
- std::ios_base::ios_base(const std::ios_base&)' is private 错误
- error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private
- error C2784: 'bool std::operator <(const std::_Tre
- error: std::ios_base::ios_base(const std::ios_base&)’是私有的
- std::ios_base::ios_base(const std::ios_base&)' is private 错误
- std::string 转换为 const* char
- [C++]char* const char* std::string区分
- C++ std::mutex 与 const函数
- const std::string转换为const wchar_t* string
- "std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const"问题的解决办法
- VS2010中error C2780: const _Ty &std::max(const _Ty &,const _Ty &,_Pr)
- error C2780: const _Ty &std::max(const _Ty &,const _Ty &,_Pr)
- 为什么std::string不提供到const char *的operator?
- error: const std::string message = "Hello" + ", world" + exclam;
- 用std::set来保存char*/const char*
- QGC之QGCView.qml
- Django(五)中间件
- 用kotlin写了一些android常用的一些工具类
- 如何更好处理数据仓库服务必然需要云数据库HybridDBforPostgreSQL
- 用kotlin写的android Log的几乎完美封装
- std const &
- Android软键盘与EditText近乎完美的交互
- 打造不一样的android log日志类
- unity4——unity5升级过程中常见问题
- 17.9.18日报
- java用ffmpeg来截图
- 深究java.lang.Class.getResource(String)与java.lang.ClassLoader.getResource(String)
- iOS开发 Xcode8中遇到的问题及改动
- Linux 下安装mysql 出现libncurses.so.5 is needed by MySQL-client-5.6.22-1.el6.i686解决办法