C++ 学习笔记-8

小编 2026-06-13 阅读:419 评论:0
分清楚 declaration 和 definition; initializ 和 assignment 在C中可以认为 initalize 和 assignment 是一样的 但是在啊C++中是完全不一样...

分清楚 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 <iostream>
#include <cstdio>
#include <string>
#include <cstring>      // #include <string.h>
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 = %p\\n\", 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;
}

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表