c++ 构造函数、拷贝构造函数——c++复习(二)

c++
#param mark 数据类型  string代替char*
void TV::power() {
    cout<<"power"<<endl;
    string name = "FCF";
    string hobby("eat");
    cout<<name<<hobby<<endl;

    string s1;
    if (s1.empty()) {
        cout<<"s1 empty"<<endl;
    }
    string s2("abc");
    cout<<s2<<endl;
    string s3(s2);//s2的副本
    cout<<s3<<":"<<s3.size()<<endl;
    string s4(3,'c');//
    cout<<s4<<endl;
    cout<<s3+s4<<endl;
    if (s3!=s2) {
        cout<<s3<<endl;
    }else{
//        string s5 = "f"+"c";这是错误的,要使用+,则必须有一个是string变量
        string s5 = "f"+s4+"f";
        cout<<s5<<endl;
        cout<<s5[0]<<endl;
    }
}

#param 类与对象
/**
 *  内存分配
 *  栈区:存储函数栈中的变量 int x=0,int *p = NULL;系统自动管理
 *  堆区:new分配出的内存 int *p = new int;需要手动管理
 *  全局区:存储全局变量和静态变量
 *  常量区:存储常量
 *  代码区:存储代码
 */
 #.h
class Car
{
private:
    int m_posX;
    int m_posY;
public:
    void init(){m_posX = 0;m_posY =0;};
    /**
     *  有且只有一次的初始化,根据条件初始化
     */
    //构造函数实例化时被自动调用;构造函数与类名同名;构造函数没有返回值;构造函数可以进行重载;实例化对象时构造函数有且只用到一次;用户没有定义构造函数时,编译器自动生成构造函数
    //构造函数可以有参和无参,不需要传参数的就是默认构造函数,一个类可以没有默认构造函数;所有构造函数如果都带有默认值,那么这个构造函数也是默认构造函数
    Car(){};
    Car(int x){m_posX = x;};
    Car(int x,int y){m_posX = x;m_posY = y;};
//    Car():m_posX(0),m_posY(1){};//初始化列表
};

class Teacher
{
private:
    string m_name;
    int m_age;
    const int m_iMax;//这种成员变量必须在函数初始化列表中初始化//
public:
    Teacher(string name = "fcf",int age = 1,int max = 100);//默认构造函数
    Teacher(const Teacher&);//拷贝构造函数,只是一个引用而已。所以要想使用拷贝赋值传参,必须给参数另外复制
    ~Teacher();//析构函数,如果没有自定义,系统会产生一个析沟函数,析构函数在对象销毁时自动调用,如果在构造函数有申请堆内存,那么在析沟函数中要手动释放
    void setName(string _name);
    void setAge(int _age);
    string getName();
    int getAge();
};
#.m
Teacher::Teacher(string name,int age,int max):m_name(name),m_age(age),m_iMax(max){
    cout<<"构造函数"<<endl;
}

Teacher::Teacher(const Teacher&te):m_name(te.m_name),m_age(te.m_age),m_iMax(te.m_iMax) {
    cout<<"拷贝构造函数"<<endl;
}
Teacher::~Teacher(){
    cout<<"析构函数"<<endl;
}
void Teacher::setName(string _name){
    m_name = _name;
}
void Teacher::setAge(int _age){
    m_age = _age;
}
string Teacher::getName(){
    return m_name;
}
int Teacher::getAge(){
    return m_age;
}
#.main
void test(Teacher t);
int main(int argc, const char * argv[]) {
    Car car1;
    Car car2(0);
    Car car3(0, 1);

    Teacher t1;
    cout<<t1.getName()<<" "<<t1.getAge()<<endl;
    Teacher t2 = t1;
    cout<<t2.getName()<<" "<<t2.getAge()<<endl;
    Teacher t3(t1);
    cout<<t3.getName()<<" "<<t3.getAge()<<endl;
    //我们看到Teacher的构造函数只打印了一次,但是三个对象也都实例化了。那么后两个调用的就是拷贝构造函数
    test(t1);//这样参数传递也会调用拷贝构造函数

    Teacher t5;
    memcpy(&t5, &t1, sizeof(Teacher));//地址重新拷贝
    cout<<t5.getName()<<" "<<t5.getAge()<<endl;
    return 0;
}

void test(Teacher t){

}

注意:const类型和引用类型,在创建的时候,必须进行初始化,即在初始值列表进行初始化,切勿在构造函数体进行初始化。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值