On Fri, May 25, Jan Kupec wrote:
by "value" or by "const &".
What's better here? Passing the pointer by value or reference? I used const & to declare constness (shell we possibly modify the object?) and to avoid copying.
I'm a fan of "const &", unless it is an integral type. No matter how cheap it is to copy class, it's hardly cheaper than a "const &". Even a class like a smart pointer (or any other class using PIMPL, a std::string e.g. ) has to adjust at least a refcount (2times+1check for counter==0), if a copy is created. And be aware that a copy of a container like list/set/map is not cheap! It is right, that the copies share the payload data, but the list/tree structure is duplicated. That's one reason why one should consider providing iterators, instead of passing back containers. class Foo { NOT: std::list<int> getlist() const; OR: const std::list<int> & getlist() const; BUT: typedef std::list<int> ContainerType; typedef ContainerType::size_type size_type; typedef ContainerType::value_type value_type; typedef ContainerType::iterator iterator; typedef ContainerType::const_iterator const_iterator; bool empty() const { return container.empty(); } size_type size() const { return container.size(); } const_iterator begin() const { return container.begin(); } const_iterator end() const { return container.end(); } // in most classes you will NOT provide nonconst iterators! iterator begin() { return container.begin(); } iterator end() { return container.end(); } }; One benefit for the user: He's not tied to a certain container: Foo foo; std::list<int> mLists( foo.begin(), foo.end() ); std::set<int> mSet ( foo.begin(), foo.end() ); std::vector<int> mVec ( foo.begin(), foo.end() ); // or std::for_each( foo.begin(), foo.end(), &doSomething ); -- cu, Michael Andres +------------------------------------------------------------------+ Key fingerprint = 2DFA 5D73 18B1 E7EF A862 27AC 3FB8 9E3A 27C6 B0E4 +------------------------------------------------------------------+ Michael Andres YaST Development ma@novell.com SUSE LINUX Products GmbH, GF: Markus Rex, HRB 16746 (AG Nuernberg) Maxfeldstrasse 5, D-90409 Nuernberg, Germany, ++49 (0)911 - 740 53-0 +------------------------------------------------------------------+ -- To unsubscribe, e-mail: zypp-devel+unsubscribe@opensuse.org For additional commands, e-mail: zypp-devel+help@opensuse.org