学习C++primer 第16天 之 小问题

jinjunweiruan 2008-07-18 06:59:07
1.书上有这么一句话:“普通的非引用类型的实参数通过复制对应的实参实现初始化”
我想问下, 为什么要复制后拿那个副本来初始化?为何不直接用实参去初始化?是为了安全?是的话,那我先得到副本后,不用副本去初始化,而用原来的实参去初始化。这样与“用副本去初始化”有什么区别。
不是为了安全,那是为了什么。。


2.
void f(T&);
书上解答说:“第个是引用.”
怎么引用的这个符号&在后面呢?...
应该在前面啊。还是其实2种都可以。
XX啊。。
...全文
190 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinjunweiruan 2008-07-18
  • 打赏
  • 举报
回复
形参是个副本。。。。???
jinjunweiruan 2008-07-18
  • 打赏
  • 举报
回复
14.15.16.的是正解吗?...
bendise 2008-07-18
  • 打赏
  • 举报
回复
我想问下, 为什么要复制后拿那个副本来初始化?为何不直接用实参去初始化?是为了安全?是的话,那我先得到副本后,不用副本去初始化,而用原来的实参去初始化。这样与“用副本去初始化”有什么区别。

他说的是非引用的形参,如果是非引用的形参就是一个副本,如果是引用的形参就不是一个副本,至于你说的“为何不直接用实参去初始化”
如果是非引用的形参,就是用的实参去初始化的,你这里不理解是因为你对形参和实参的感念比较模糊,建议查下资料

void f(T&);
书上解答说:“第个是引用.”
怎么引用的这个符号&在后面呢?...
应该在前面啊。还是其实2种都可以。

这个是头文件里的声明,不是实做,他传入了一个T类型的形参引用
xjywc 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 OufengMorpheus 的回复:]
为什么要复制后拿那个副本来初始化?
被调函数会在栈上开辟一块自己的空间.调用时这个副本就在这块空间中.
这是编译器的做法.这样的函数运行不会影响主调函数的地址空间值.

void f(T&);
函数原型声明.参数名是可选的.
void f(T& a);
如果作者这样写你就觉得爽了.
T是一个自定义类型.
[/Quote]

正解,被调函数确实在函数堆栈上用副本初始化,除了引用和指针传值外是直接操作对象外,其余实参都是在函数堆栈上进行操作,函数退出后对主调函数没影响。

函数声明是T& 就是声明啊,就像你用的void f(int*)只是进行声明,不需要参数,而且&在c++中是引用的含义,并不是c中取地址的含义,对引用对象直接进行操作。
sunhuanwen 2008-07-18
  • 打赏
  • 举报
回复
1, 拿副本初始化 是因为参数如果不是引用或者指针,那么就不知道地址,只能传递由原值拷贝过来的值。因此要用副本初始化。

2, void f(T&);
这句话仅仅是个函数声明,T可以理解为int,float之类的类型,因为仅仅是声明,所以可以省略参数名。
wjb_yd 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 jinjunweiruan 的帖子:]
1.书上有这么一句话:“普通的非引用类型的实参数通过复制对应的实参实现初始化”
我想问下, 为什么要复制后拿那个副本来初始化?为何不直接用实参去初始化?是为了安全?是的话,那我先得到副本后,不用副本去初始化,而用原来的实参去初始化。这样与“用副本去初始化”有什么区别。
不是为了安全,那是为了什么。。
[/Quote]

不是拿副本初始化,而是拿实参初始化副本,副本的名字叫形参。
Lstyk 2008-07-18
  • 打赏
  • 举报
回复
"我想问下, 为什么要复制后拿那个副本来初始化?为何不直接用实参去初始化?是为了安全?是的话,那我先得到副本后,不用副本去初始化,而用原来的实参去初始化。这样与“用副本去初始化”有什么区别。"

不是拿副本去初始化吧~~
而是那个形参是实参的一个副本,形参是由实参初始化的,它是实参的副本。
hahaysw 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jinjunweiruan 的回复:]
按址传递 pass by address 函数里的参数叫实参
f(int* a)
按引用传递 pass by reference 函数里的参数叫实参
f(int& a)
....
这样。。。。的。。说。。。
没像到是这样,我一直以为实参就是定义的时候的那个,比如int i=a,让后用函数传递。。。我一直以为是a是个实参。。。。。
[/Quote]
f(int& a)
f(int* a)
上面的a都是行参.int *a;f(a)这的a才是实参.
行参是函数定义时的参数,实参是调用函数传入的参数.

我也是新手,不知道上面的对不对~
matrixdwy 2008-07-18
  • 打赏
  • 举报
回复
我怀疑LS是开窑子的。。。。。。
zghua851004 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 matrixdwy 的回复:]
LZ好早,各位好早
[/Quote]
pengzhixi 2008-07-18
  • 打赏
  • 举报
回复
拿副本来初始化是为了保护实参。
void f(T&); 是省略了参数名,前面的T是类型名。
jinjunweiruan 2008-07-18
  • 打赏
  • 举报
回复
去找点资料看看

函数确实博大精深..
jinjunweiruan 2008-07-18
  • 打赏
  • 举报
回复
按址传递 pass by address 函数里的参数叫实参
f(int* a)
按引用传递 pass by reference 函数里的参数叫实参
f(int& a)
....
这样。。。。的。。说。。。
没像到是这样,我一直以为实参就是定义的时候的那个,比如int i=a,让后用函数传递。。。我一直以为是a是个实参。。。。。
matrixdwy 2008-07-18
  • 打赏
  • 举报
回复
LZ应该先搞清楚函数传参的三种方式
按值传递 pass by value 函数里的参数叫形参
f(int a)
按址传递 pass by address 函数里的参数叫实参
f(int* a)
按引用传递 pass by reference 函数里的参数叫实参
f(int& a)
matrixdwy 2008-07-18
  • 打赏
  • 举报
回复
LZ好早,各位好早
SeanHwang 2008-07-18
  • 打赏
  • 举报
回复
1这个问题,LZ去看看随便哪本C书上就有的指针参数和一般参数的swap()就可以了~
2只是个函数原型,只是声明一下,所以T只是自己定义的一个类而已.
elegant87 2008-07-18
  • 打赏
  • 举报
回复
1.普通的非引用类型的形参就死通过值传递来实现的,
在传递的过程中不会改变实参的值,这是很安全的!

2.这是原型说明,只给出类类型,没给出参数。
你可以理解为void f(T& t)
K行天下 2008-07-18
  • 打赏
  • 举报
回复
1\
非引用 形参 就是传值的概念,复制一份,不会在函数类改变参数值

2 这是原型说明,只给出类类型,没给出参数, 就如 int max(int,int);

实际是void f(T& t);
肯定是在后面啊!
OphoneOu 2008-07-18
  • 打赏
  • 举报
回复
为什么要复制后拿那个副本来初始化?
被调函数会在栈上开辟一块自己的空间.调用时这个副本就在这块空间中.
这是编译器的做法.这样的函数运行不会影响主调函数的地址空间值.

void f(T&);
函数原型声明.参数名是可选的.
void f(T& a);
如果作者这样写你就觉得爽了.
T是一个自定义类型.
sunhuanwen 2008-07-18
  • 打赏
  • 举报
回复
pass by heart!!!
加载更多回复(3)

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧