由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 形参可以直接使用私有数据成员?
相关主题
请叫一个 template class constructor 的问题c++ new的一个问题
Why my new or delete operator would fail?
相关话题的讨论汇总
话题: operator话题: new话题: ptr话题: void话题: int
进入Programming版参与讨论
1 (共1页)
y**b
发帖数: 10166
1
class HasPtr {
public:
HasPtr(const int &p, int i): ptr(new int(p)), val(i) {}
HasPtr(const HasPtr &orig):
ptr(new int (*orig.ptr)), val(orig.val) { }
HasPtr& operator=(const HasPtr&);

~HasPtr() { delete ptr; }
int get_ptr_val() const { return *ptr; }
int get_int() const { return val; }
void set_ptr(int *p) { ptr = p; }
void set_int(int i) { val = i; }
int *get_ptr() const { return ptr; }
void set_ptr_val(int p) const { *ptr = p; }

private:
int *ptr;
int val;
};
里面orig.val合法吗?为什么不是orig.get_int()呢。
r****t
发帖数: 10904
2
这个必须要行的,是 copy ctor 的特权。
(我的理解是)要不然 synthetic copy ctor 就死翘翘了。
不服的话可以看这页:
http://www.learncpp.com/cpp-tutorial/911-the-copy-constructor-a
btw: assume 形参 means reference.

【在 y**b 的大作中提到】
: class HasPtr {
: public:
: HasPtr(const int &p, int i): ptr(new int(p)), val(i) {}
: HasPtr(const HasPtr &orig):
: ptr(new int (*orig.ptr)), val(orig.val) { }
: HasPtr& operator=(const HasPtr&);
:
: ~HasPtr() { delete ptr; }
: int get_ptr_val() const { return *ptr; }
: int get_int() const { return val; }

S*********g
发帖数: 5298
3
Private
Private is the default access specifier for every declared data item in a
class. Private data belongs to the same class in which it is created and can
only be used by the other members of the same class.
It is on the level of per-class not per object

【在 y**b 的大作中提到】
: class HasPtr {
: public:
: HasPtr(const int &p, int i): ptr(new int(p)), val(i) {}
: HasPtr(const HasPtr &orig):
: ptr(new int (*orig.ptr)), val(orig.val) { }
: HasPtr& operator=(const HasPtr&);
:
: ~HasPtr() { delete ptr; }
: int get_ptr_val() const { return *ptr; }
: int get_int() const { return val; }

r****t
发帖数: 10904
4
ai, 你说的对。

can

【在 S*********g 的大作中提到】
: Private
: Private is the default access specifier for every declared data item in a
: class. Private data belongs to the same class in which it is created and can
: only be used by the other members of the same class.
: It is on the level of per-class not per object

y**b
发帖数: 10166
5
sigh,我没看明白,或者说字面上看明白了,不明白跟问题是什么联系

【在 r****t 的大作中提到】
: ai, 你说的对。
:
: can

t****t
发帖数: 6806
6
这问过好多次了, 都快月经了
superstring说得很明白了, 你不明白我给你翻译一下:私有成员只能被同类的其它成员
访问. 这说是同类的其它成员, 没说同对象的其它成员(也没这个概念).

【在 y**b 的大作中提到】
: sigh,我没看明白,或者说字面上看明白了,不明白跟问题是什么联系
y**b
发帖数: 10166
7
微妙,谢了。

【在 t****t 的大作中提到】
: 这问过好多次了, 都快月经了
: superstring说得很明白了, 你不明白我给你翻译一下:私有成员只能被同类的其它成员
: 访问. 这说是同类的其它成员, 没说同对象的其它成员(也没这个概念).

r****t
发帖数: 10904
8
为啥没有 per-object 的 access control? It can be useful, isn't it?

【在 t****t 的大作中提到】
: 这问过好多次了, 都快月经了
: superstring说得很明白了, 你不明白我给你翻译一下:私有成员只能被同类的其它成员
: 访问. 这说是同类的其它成员, 没说同对象的其它成员(也没这个概念).

t****t
发帖数: 6806
9
make an example?

【在 r****t 的大作中提到】
: 为啥没有 per-object 的 access control? It can be useful, isn't it?
r****t
发帖数: 10904
10
for example, instances of Employee Type are not suppose to be able to read
reach other's .salary private member. instances of Employer Type are not
supposed to be able to read each other's .planned_price private member...
and so on.

【在 t****t 的大作中提到】
: make an example?
相关主题
Why my new or delete operator would fail?请叫一个 template class constructor 的问题
c++ new的一个问题
进入Programming版参与讨论
S*********g
发帖数: 5298
11
salary should not be a member of employee
salary in reality is a contract between employee and employer

【在 r****t 的大作中提到】
: for example, instances of Employee Type are not suppose to be able to read
: reach other's .salary private member. instances of Employer Type are not
: supposed to be able to read each other's .planned_price private member...
: and so on.

t****t
发帖数: 6806
12
你完全搞错了. accessibility和security是完全不相干的两件事. accessibility要防
止的是程序员无意中犯的错误----programmers are forced to use the interface,
by the class designers (probably themselves).
事实上, c++大部分的feature都是用来防止程序员无意中的错误. 如果你self-
discipline到一定程度, 足够尊重C++的风格, 那么很多程序能编译, 自动就是正确的,
most errors are found compile-time. 为什么经常有面试题问, 如何禁止在堆上创
建对象? 如何禁止在栈上创建对象? 诸如此类的问题, 不是面试人吃饱了撑的, 或者要
问回字有几种写法, 而是C++本身的思想就是这样子, 依靠语言的特性来规范程序/程序
员, 以及做cross-check. 为什么有这么多的const? 事实上, 你在所有的地方都不用
const, 很多程序还是可以编译. 但是你把一个东西声明成const, 那就是一种self-
discipline, 你付出的代价是不能乱写, 连带很多别的东西都是const, 但是你得到的
好处是你把你的设计告诉编译器, 编译器替你检查你有没有不小心违背你自己的设计.
C里面根本没有public/private, 大家还是一样写, 但是private本身就是self-
discipline的一种表现.
从另一方面说, C++里根本没有security feature, 不是少, 而是没有. 因为这根本不
是C/C++语言的任务. security是OS和CPU的事情.

【在 r****t 的大作中提到】
: for example, instances of Employee Type are not suppose to be able to read
: reach other's .salary private member. instances of Employer Type are not
: supposed to be able to read each other's .planned_price private member...
: and so on.

S*********g
发帖数: 5298
13
你说的这段话,我好想在C++ FAQ和thinking in C++里好像都有看到过

的,

【在 t****t 的大作中提到】
: 你完全搞错了. accessibility和security是完全不相干的两件事. accessibility要防
: 止的是程序员无意中犯的错误----programmers are forced to use the interface,
: by the class designers (probably themselves).
: 事实上, c++大部分的feature都是用来防止程序员无意中的错误. 如果你self-
: discipline到一定程度, 足够尊重C++的风格, 那么很多程序能编译, 自动就是正确的,
: most errors are found compile-time. 为什么经常有面试题问, 如何禁止在堆上创
: 建对象? 如何禁止在栈上创建对象? 诸如此类的问题, 不是面试人吃饱了撑的, 或者要
: 问回字有几种写法, 而是C++本身的思想就是这样子, 依靠语言的特性来规范程序/程序
: 员, 以及做cross-check. 为什么有这么多的const? 事实上, 你在所有的地方都不用
: const, 很多程序还是可以编译. 但是你把一个东西声明成const, 那就是一种self-

r****t
发帖数: 10904
14
真是胜读十年书阿。。。

的,

【在 t****t 的大作中提到】
: 你完全搞错了. accessibility和security是完全不相干的两件事. accessibility要防
: 止的是程序员无意中犯的错误----programmers are forced to use the interface,
: by the class designers (probably themselves).
: 事实上, c++大部分的feature都是用来防止程序员无意中的错误. 如果你self-
: discipline到一定程度, 足够尊重C++的风格, 那么很多程序能编译, 自动就是正确的,
: most errors are found compile-time. 为什么经常有面试题问, 如何禁止在堆上创
: 建对象? 如何禁止在栈上创建对象? 诸如此类的问题, 不是面试人吃饱了撑的, 或者要
: 问回字有几种写法, 而是C++本身的思想就是这样子, 依靠语言的特性来规范程序/程序
: 员, 以及做cross-check. 为什么有这么多的const? 事实上, 你在所有的地方都不用
: const, 很多程序还是可以编译. 但是你把一个东西声明成const, 那就是一种self-

r****t
发帖数: 10904
15
C++FAQ 7.7 and 7.8?
又拿起 thinking in c++ 翻了几页,觉得 primer 写得差远了啊,为啥评价却很高?

【在 S*********g 的大作中提到】
: 你说的这段话,我好想在C++ FAQ和thinking in C++里好像都有看到过
:
: 的,

S*********g
发帖数: 5298
16
不知道。没看过primer
看书这东西主要还是看自己能理解多少记住多少,
要不然写的再好也没什么用啊

【在 r****t 的大作中提到】
: C++FAQ 7.7 and 7.8?
: 又拿起 thinking in c++ 翻了几页,觉得 primer 写得差远了啊,为啥评价却很高?

t****t
发帖数: 6806
17
本来就是C++的思想嘛. 这两本我没看过, 我看的effective c++, 也有类似的说法.

【在 S*********g 的大作中提到】
: 你说的这段话,我好想在C++ FAQ和thinking in C++里好像都有看到过
:
: 的,

L***n
发帖数: 6727
18
弱问一句,如何禁止在堆上或者栈上创建对象啊?

的,

【在 t****t 的大作中提到】
: 你完全搞错了. accessibility和security是完全不相干的两件事. accessibility要防
: 止的是程序员无意中犯的错误----programmers are forced to use the interface,
: by the class designers (probably themselves).
: 事实上, c++大部分的feature都是用来防止程序员无意中的错误. 如果你self-
: discipline到一定程度, 足够尊重C++的风格, 那么很多程序能编译, 自动就是正确的,
: most errors are found compile-time. 为什么经常有面试题问, 如何禁止在堆上创
: 建对象? 如何禁止在栈上创建对象? 诸如此类的问题, 不是面试人吃饱了撑的, 或者要
: 问回字有几种写法, 而是C++本身的思想就是这样子, 依靠语言的特性来规范程序/程序
: 员, 以及做cross-check. 为什么有这么多的const? 事实上, 你在所有的地方都不用
: const, 很多程序还是可以编译. 但是你把一个东西声明成const, 那就是一种self-

r****t
发帖数: 10904
19
prevent stack: private dtor
prevent heap: private new, new array, placement new operators

【在 L***n 的大作中提到】
: 弱问一句,如何禁止在堆上或者栈上创建对象啊?
:
: 的,

p*********t
发帖数: 2690
20
operator new, operator delete overloaded as private时, new的重载函数里面还是
要用malloc.
哪位高手写一下overload new的code ?

【在 r****t 的大作中提到】
: prevent stack: private dtor
: prevent heap: private new, new array, placement new operators

相关主题
请叫一个 template class constructor 的问题c++ new的一个问题
Why my new or delete operator would fail?
进入Programming版参与讨论
t****t
发帖数: 6806
21
why?

【在 p*********t 的大作中提到】
: operator new, operator delete overloaded as private时, new的重载函数里面还是
: 要用malloc.
: 哪位高手写一下overload new的code ?

D*******a
发帖数: 3688
22
i think malloc is weak-symboled, which means you can implement your own
easily. That's how tcmalloc does it.

【在 p*********t 的大作中提到】
: operator new, operator delete overloaded as private时, new的重载函数里面还是
: 要用malloc.
: 哪位高手写一下overload new的code ?

p*********t
发帖数: 2690
23
new 可以进行内存分配和对对象使用constructor.这个new 如果overload,怎么体现这
一点?

【在 D*******a 的大作中提到】
: i think malloc is weak-symboled, which means you can implement your own
: easily. That's how tcmalloc does it.

X****r
发帖数: 3557
24
You can overload operator new for the class in question and call
the global operator new inside the implementation.

【在 p*********t 的大作中提到】
: new 可以进行内存分配和对对象使用constructor.这个new 如果overload,怎么体现这
: 一点?

p*********t
发帖数: 2690
25
你要不写个new overload的code? new作为操作符,后面跟的参数有好几种,比如,如果
class名字叫Student,那么new后面的参数可以是,Student,Student(),Student[5]

【在 X****r 的大作中提到】
: You can overload operator new for the class in question and call
: the global operator new inside the implementation.

S*********g
发帖数: 5298
26
哈哈,你在质疑C++标准都倒背如流的xentar吗?

【在 p*********t 的大作中提到】
: 你要不写个new overload的code? new作为操作符,后面跟的参数有好几种,比如,如果
: class名字叫Student,那么new后面的参数可以是,Student,Student(),Student[5]

X****r
发帖数: 3557
27
You are mixing "operator new", the overloadable function, and the
"new operator", or the new expression, which has its special syntax
as your example shows.
There are only 3 forms (signatures) of "operator new": normal, no-throw,
and placement (普文二?), and 3 corresponding forms of "operator new[]".
A new expression calls either operator new or operator new[], and
constructor of the class, etc. operator new or operator new[] never calls
the constructor, and do not care about how the object or objects are
initialized.

【在 p*********t 的大作中提到】
: 你要不写个new overload的code? new作为操作符,后面跟的参数有好几种,比如,如果
: class名字叫Student,那么new后面的参数可以是,Student,Student(),Student[5]

r****t
发帖数: 10904
28
edit: this post is incomplete/wrong, read others if you care to know the correct summary.
I went back to check primer,it seems there're 2 operator new:
void* operator new(size_t n_bytes);
void* operator new[](size_t n_elements);
which only allocate mem.
and three (普文二) forms of new expression. The 普 can call either forms of
operator new. The 二(placement new) does not call any operator new, but
calls ctors directly. primer does not talk about 文 (nothrow), which appears
on some webpage i stumbled upon earlier, couldn't find it any more.

【在 X****r 的大作中提到】
: You are mixing "operator new", the overloadable function, and the
: "new operator", or the new expression, which has its special syntax
: as your example shows.
: There are only 3 forms (signatures) of "operator new": normal, no-throw,
: and placement (普文二?), and 3 corresponding forms of "operator new[]".
: A new expression calls either operator new or operator new[], and
: constructor of the class, etc. operator new or operator new[] never calls
: the constructor, and do not care about how the object or objects are
: initialized.

t****t
发帖数: 6806
29
18.4 Dynamic memory management [lib.support.dynamic]
1 The header defines several functions that manage the allocation of
dynamic storage in a program.
It also defines components for reporting storage management errors.
Header synopsis
namespace std {
class bad_alloc;
struct nothrow_t {};
extern const nothrow_t nothrow;
typedef void (*new_handler)();
new_handler set_new_handler(new_handler new_p) throw();
}
void* operator new(std::size_t size) throw(std::bad_alloc);
void* operator new(std::size_t size, const std::nothrow_t&) throw();
void operator delete(void* ptr) throw();
void operator delete(void* ptr, const std::nothrow_t&) throw();
void* operator new[](std::size_t size) throw(std::bad_alloc);
void* operator new[](std::size_t size, const std::nothrow_t&) throw();
void operator delete[](void* ptr) throw();
void operator delete[](void* ptr, const std::nothrow_t&) throw();
void* operator new (std::size_t size, void* ptr) throw();
void* operator new[](std::size_t size, void* ptr) throw();
void operator delete (void* ptr, void*) throw();
void operator delete[](void* ptr, void*) throw();
SEE ALSO: 1.7, 3.7.3, 5.3.4, 5.3.5, 12.5, 20.4.

of
appears

【在 r****t 的大作中提到】
: edit: this post is incomplete/wrong, read others if you care to know the correct summary.
: I went back to check primer,it seems there're 2 operator new:
: void* operator new(size_t n_bytes);
: void* operator new[](size_t n_elements);
: which only allocate mem.
: and three (普文二) forms of new expression. The 普 can call either forms of
: operator new. The 二(placement new) does not call any operator new, but
: calls ctors directly. primer does not talk about 文 (nothrow), which appears
: on some webpage i stumbled upon earlier, couldn't find it any more.

r****t
发帖数: 10904
30
I see, for either array or a single object, there're 3 "new operators", each
corresponds to a form of new expression. This is much more cleaner.
Thx!

【在 t****t 的大作中提到】
: 18.4 Dynamic memory management [lib.support.dynamic]
: 1 The header defines several functions that manage the allocation of
: dynamic storage in a program.
: It also defines components for reporting storage management errors.
: Header synopsis
: namespace std {
: class bad_alloc;
: struct nothrow_t {};
: extern const nothrow_t nothrow;
: typedef void (*new_handler)();

相关主题
Why my new or delete operator would fail?请叫一个 template class constructor 的问题
c++ new的一个问题
进入Programming版参与讨论
X****r
发帖数: 3557
31
Why don't you directly read the C++ standard? If you want
a reference to a language feature, you always read the standard,
no?
For C++ 98 see
5.3.4 New [expr.new]
12.5 Free store [class.free]
17.3.3.4 Replacement functions [lib.replacement.functions]
18.4 Dynamic memory management [lib.support.dynamic]
Note that you cannot replace (redefine) the global placement new,
even you can replace the other two operator new forms. On the
other hand, for your own class you can define all three forms of
operator new. (this can be deduced from the above sections, too)

of
appears

【在 r****t 的大作中提到】
: I see, for either array or a single object, there're 3 "new operators", each
: corresponds to a form of new expression. This is much more cleaner.
: Thx!

X****r
发帖数: 3557
32
yeah, I'm too slow.

【在 t****t 的大作中提到】
: 18.4 Dynamic memory management [lib.support.dynamic]
: 1 The header defines several functions that manage the allocation of
: dynamic storage in a program.
: It also defines components for reporting storage management errors.
: Header synopsis
: namespace std {
: class bad_alloc;
: struct nothrow_t {};
: extern const nothrow_t nothrow;
: typedef void (*new_handler)();

r****t
发帖数: 10904
33
横太师父,哪里搞一份带 link 的 standard pdf?现在手里这个版本没 pdf link, 页
码不对,还是 03 version。

【在 X****r 的大作中提到】
: Why don't you directly read the C++ standard? If you want
: a reference to a language feature, you always read the standard,
: no?
: For C++ 98 see
: 5.3.4 New [expr.new]
: 12.5 Free store [class.free]
: 17.3.3.4 Replacement functions [lib.replacement.functions]
: 18.4 Dynamic memory management [lib.support.dynamic]
: Note that you cannot replace (redefine) the global placement new,
: even you can replace the other two operator new forms. On the

p*********t
发帖数: 2690
34
今天一早醒来,看见大牛们就这个问题发表了自己的意见,真好. 不过,哪儿可以看这些
函数的源码?

【在 S*********g 的大作中提到】
: 哈哈,你在质疑C++标准都倒背如流的xentar吗?
t****t
发帖数: 6806
35
03 is the correct version.

【在 r****t 的大作中提到】
: 横太师父,哪里搞一份带 link 的 standard pdf?现在手里这个版本没 pdf link, 页
: 码不对,还是 03 version。

y**b
发帖数: 10166
36
嗯。

【在 r****t 的大作中提到】
: 真是胜读十年书阿。。。
:
: 的,

y**b
发帖数: 10166
37
抽空一口气把primer第四版看完,累个半死,笔记都写了快200条。
作为primer,这么全这么细,真的不错。
这么说吧,effective c++第二版里面的50条其实都包含在primer里面,
effective c++有空间对每个问题都有一定展开,而primer大部分只能
简单解释一下,但是也非常不错了。
thinking in c++很多专题非常深入了,比如编译器对多态的实现,
vptr/vtable这些东西,解释得实在很清楚。primer作为primer不大可能去做。
有个感觉,如果不是专职程序员,不接触大量的实际开发,对编程语言本身和
设计的理解总还是有限。比如科学计算领域,虽然不少程序是C++开发的,但是
在设计上主动运用C++那些强大而复杂特性的不多见。

【在 r****t 的大作中提到】
: C++FAQ 7.7 and 7.8?
: 又拿起 thinking in c++ 翻了几页,觉得 primer 写得差远了啊,为啥评价却很高?

t****t
发帖数: 6806
38
看书如果能积极的动脑子, 其实这几本书差别应该不是很大. 不动脑子, 就很难说了.

,但

【在 y**b 的大作中提到】
: 抽空一口气把primer第四版看完,累个半死,笔记都写了快200条。
: 作为primer,这么全这么细,真的不错。
: 这么说吧,effective c++第二版里面的50条其实都包含在primer里面,
: effective c++有空间对每个问题都有一定展开,而primer大部分只能
: 简单解释一下,但是也非常不错了。
: thinking in c++很多专题非常深入了,比如编译器对多态的实现,
: vptr/vtable这些东西,解释得实在很清楚。primer作为primer不大可能去做。
: 有个感觉,如果不是专职程序员,不接触大量的实际开发,对编程语言本身和
: 设计的理解总还是有限。比如科学计算领域,虽然不少程序是C++开发的,但是
: 在设计上主动运用C++那些强大而复杂特性的不多见。

r****t
发帖数: 10904
39
我笔记了就一页呵呵,不过把 template (chap16) 和最后一章 (chap18) 给跳过了。
effective c++ 里面的 primer 一定要说提到可能有,不过那样提了还不如不提。
看 exception safety,
看 non-local static initialization order,
看 non-const method 里面 static_cast 成 const 以后 const_cast
看 copy and swap
这些我觉得 primer 里面都没有讲。如果一个人读 primer 的时候就能想到这些,
一定是和 Meyers 一档次的强人。

【在 y**b 的大作中提到】
: 抽空一口气把primer第四版看完,累个半死,笔记都写了快200条。
: 作为primer,这么全这么细,真的不错。
: 这么说吧,effective c++第二版里面的50条其实都包含在primer里面,
: effective c++有空间对每个问题都有一定展开,而primer大部分只能
: 简单解释一下,但是也非常不错了。
: thinking in c++很多专题非常深入了,比如编译器对多态的实现,
: vptr/vtable这些东西,解释得实在很清楚。primer作为primer不大可能去做。
: 有个感觉,如果不是专职程序员,不接触大量的实际开发,对编程语言本身和
: 设计的理解总还是有限。比如科学计算领域,虽然不少程序是C++开发的,但是
: 在设计上主动运用C++那些强大而复杂特性的不多见。

S*********g
发帖数: 5298
40
同意。愿意仔细想的,看C++标准
愿意跟着别人怎么讲的,看thinking in C++

【在 t****t 的大作中提到】
: 看书如果能积极的动脑子, 其实这几本书差别应该不是很大. 不动脑子, 就很难说了.
:
: ,但

相关主题
请叫一个 template class constructor 的问题c++ new的一个问题
Why my new or delete operator would fail?
进入Programming版参与讨论
S*********g
发帖数: 5298
41
记笔记只是手段,关键是要记在脑子里。
我当年就看了一个thinking in C++,一个字笔记也没记,
去考brainbench的C++,也考了99%的percentile

【在 r****t 的大作中提到】
: 我笔记了就一页呵呵,不过把 template (chap16) 和最后一章 (chap18) 给跳过了。
: effective c++ 里面的 primer 一定要说提到可能有,不过那样提了还不如不提。
: 看 exception safety,
: 看 non-local static initialization order,
: 看 non-const method 里面 static_cast 成 const 以后 const_cast
: 看 copy and swap
: 这些我觉得 primer 里面都没有讲。如果一个人读 primer 的时候就能想到这些,
: 一定是和 Meyers 一档次的强人。

r****t
发帖数: 10904
42
brainbench c++ 是啥?

【在 S*********g 的大作中提到】
: 记笔记只是手段,关键是要记在脑子里。
: 我当年就看了一个thinking in C++,一个字笔记也没记,
: 去考brainbench的C++,也考了99%的percentile

y**b
发帖数: 10166
43
如果是专职程序员天天用天天玩那是肯定要记脑子里。如果不是,比如几年后要重新扩
充一个程序,还是挺头疼的。

【在 S*********g 的大作中提到】
: 记笔记只是手段,关键是要记在脑子里。
: 我当年就看了一个thinking in C++,一个字笔记也没记,
: 去考brainbench的C++,也考了99%的percentile

S*********g
发帖数: 5298
44
具体细节写法可能会忘。
那些重要的概念忘不了的

【在 y**b 的大作中提到】
: 如果是专职程序员天天用天天玩那是肯定要记脑子里。如果不是,比如几年后要重新扩
: 充一个程序,还是挺头疼的。

1 (共1页)
进入Programming版参与讨论
相关主题
请叫一个 template class constructor 的问题c++ new的一个问题
Why my new or delete operator would fail?
相关话题的讨论汇总
话题: operator话题: new话题: ptr话题: void话题: int