加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C++ 学习笔记-8

发布时间:2020-12-15 04:57:23 所属栏目:百科 来源:网络整理
导读:分清楚 declaration 和 definition; initializ 和 assignment 在C中可以认为 initalize 和 assignment 是一样的 但是在啊C++中是完全不一样的 在C++,int a(10); 和 int a = 10; 是等价的,两者都是初始化 构造函数的参数表如果只有一个,而且是该类对象的常

分清楚 declaration 和 definition; initializ 和 assignment


在C中可以认为 initalize 和 assignment 是一样的


但是在啊C++中是完全不一样的


在C++,int a(10); 和 int a = 10; 是等价的,两者都是初始化

构造函数的参数表如果只有一个,而且是该类对象的常引用,那么这个构造函数称为拷贝构造函数或者复制构造函数


如果没有给出复制构造函数那么编译器默认生成,默认生成的拷贝构造函数会拷贝每一个成员变量


如果这个类的成员变量是其他类的对象,那么他会让那个类的拷贝构造函数来拷贝构造那个对象


所以你的类的成员变量有其他类的对象,那么这个拷贝构造函数会被递归的下去


这个拷贝实在成员级别上的拷贝,不是在字节上的拷贝。如果有其他教科书上写的是字节级别上的拷贝,那它是错的


如果有指针的话会发生指针的拷贝,结果就是两个指针指向同一块内存


同样的道理,如果是引用,那么两个引用变量引用的是同一个


如果拷贝构造函数的参数标语是引用,那么会发生拷贝构造函数的递归

private 是针对类而不是针对 对象

Person f()


{


? ? Person ip;


? ? return ip;


}


person p = f();?


有可能发生两种情况


? ? 1: 直接就是 person p = ip;


? ? 2: person tmp = ip; ? ? p = tmp;


两种情况的发生是根据编译器的情况,有些编译器优化掉它认为不必要的拷贝构造

任何对象都只能初始化一次,之后再做相似的动作就是赋值了


在写C++程序应该尽量用string类,而不是 char *


用char * 只有一个目的,我要直接访问内存了,或者要做二进制数据


如果做得是纯字符串应该用string

建议:


? ? 1: 写一个类,就为这个类写一个拷贝构造函数


? ? 2: 写一个default constructor


? ? 3: 写一个 virtual 的析构函数


? ? 4: 不要依赖编译器给的函数


如果你的拷贝构造函数是 private 的,那么别人就无法拷贝构造你这个类的对象


java所有的对象都是通过指针来传递得到

learning record code:

#include

#include

#include

#include // #include

using namespace std;

static int objectCount = 0;

class HowMany{

public:

HowMany(){ objectCount ++; print("HowMany()"); }

HowMany(int i) { objectCount ++; print("HowMany()"); }

HowMany(const HowMany &h) { objectCount ++; print("HowMany()"); }

void print(const string &msg = "")

{

if(msg.size() != 0)

cout << msg << ": ";

cout << "ObjectCount = " << objectCount << endl;

}

~HowMany(){ objectCount --; print("~HowMany()"); }

};

HowMany f(HowMany x)

{

cout << "begin of f" << endl;

x.print("x argument of f()");

cout << "end of f" << endl;

return x;

}

class Person{

private:

char *name;

public:

Person(const char *s)

{

name = new char[::strlen(s) + 1];

::strcpy(name,s);

}

~Person() { delete []name; }

Person(const Person & per)

{

name = new char[::strlen(per.name) + 1];

::strcpy(name,per.name);

}

void print();

};

void Person::print()

{

printf("name = %pn",name);

}

class A{

public:

A() { cout << "constructor called" << endl; }

~A() { cout << "destructor called" << endl; }

A(const A & a) { cout << "copy constructor called" << endl; }

};

A f()

{

A b;

return b;

}

int main()

{

// HowMany h;

// h.print("afte construction of h");

// HowMany h2 = f(h);

// h.print("afte call to f");

// Person p1("zhang");

// Person p2(p1);

// p1.print();

// p2.print();

A p = f();

return 0;

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读