See this page as a slide show
CS253 Init Vs Assign
Loud.h
% cat ~cs253/Examples/Loud.h
// A “Loud” class. It announces whenever its methods are called.
#ifndef LOUD_H_INCLUDED
#define LOUD_H_INCLUDED
#include <iostream>
class Loud {
char c;
void hi(const char *s) const {
std::cout << "Loud::" << s;
if (c) std::cout << " [c='" << c << "']";
std::cout << std::endl; // flush debug output
}
public:
Loud(char ch = '\0') : c(ch) { hi("Loud()"); }
~Loud() { hi("~Loud()"); }
Loud(const Loud &l) : c(l.c) { hi("Loud(const Loud &)"); }
Loud(Loud &&l) : c(l.c) { hi("Loud(Loud &&)"); }
Loud& operator=(const Loud &l) { c=l.c; hi("operator=(const Loud &)"); return *this; }
Loud& operator=(Loud &&l) { c=l.c; hi("operator=(Loud &&)"); return *this; }
Loud& operator=(char ch) { c = ch; hi("operator=(char)"); return *this; }
Loud& operator++() { ++c; hi("operator++()"); return *this; }
Loud operator++(int) { hi("operator++(int)"); const auto save = *this; ++*this; return save; }
Loud operator+(const Loud &l) const { hi("operator+(const Loud &)"); return Loud(c+l.c); }
};
#endif /* LOUD_H_INCLUDED */
Example
#include "Loud.h"
int main() {
Loud a(12);
Loud b(a);
Loud c=a;
Loud d();
c = ++b;
}
Loud::Loud() [c='␌']
Loud::Loud(const Loud &) [c='␌']
Loud::Loud(const Loud &) [c='␌']
Loud::operator++() [c='␍']
Loud::operator=(const Loud &) [c='␍']
Loud::~Loud() [c='␍']
Loud::~Loud() [c='␍']
Loud::~Loud() [c='␌']
Questions & Answers
- Why did
Loud c=a
call the copy ctor instead of the assignment operator?
- Because it’s a ctor. It’s creating a
Loud
.
- Yes, the syntax uses a
=
, but it’s a ctor.
- Why did
Loud d()
not do anything?
- Because it’s a function declaration. It declares a function named
d
that takes no arguments, and returns a Loud
.
- If you want to declare a
Loud
with no arguments to the ctor,
just do this: Loud d;