Skip to main content

Item 27: Explicitly disallow use of implicitly generated member functions you don't want.

Item 27: Explicitly disallow use of implicitly generated member functions you don't want.
Suppose you want to write a class template, Array, whose generated classes behave like built-in C++ arrays in
every way, except they perform bounds checking. One of the design problems you would face is how to prohibit
assignment between Array objects, because assignment isn't legal for C++ arrays:
double values1[10];
double values2[10];
values1 = values2;
// error!
For most functions, this wouldn't be a problem. If you didn't want to allow a function, you simply wouldn't put it
in the class. However, the assignment operator is one of those distinguished member functions that C++, always
the helpful servant, writes for you if you neglect to write it yourself (see Item 45). What then to do?
The solution is to declare the function, operator= in this case, private. By declaring a member function
explicitly, you prevent compilers from generating their own version, and by making the function private, you
keep people from calling it.
However, the scheme isn't foolproof; member and friend functions can still call your private function. Unless,
that is, you are clever enough not to define the function. Then if you inadvertently call the function, you'll get an
error at link-time (see Item 46).
For Array, your template definition would start out like this:
template
class Array {
private:
// Don't define this function!
Array& operator=(const Array& rhs);
...
};
Now if a client tries to perform assignments on Array objects, compilers will thwart the attempt, and if you
inadvertently try it in a member or a friend function, the linker will yelp.
Don't assume from this example that this Item applies only to assignment operators. It doesn't. It applies to each
of the compiler-generated functions described in Item 45. In practice, you'll find that the behavioral similarities
between assignment and copy construction (see Items 11 and 16) almost always mean that anytime you want to
disallow use of one, you'll want to disallow use of the other, too.

Comments

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into ...

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checkin...