C++的一些注意事项

1、类的构造:假定MyClass是一个自定义类,则当执行 MyClass a[3],*p[2]; 实际上执行构造函数的次数只有3次,也就是对象指针数组不会引起执行构造函数。

2、常数据成员:对于常数据成员,可以在声明时一并初始化(c++11),也可以在构造函数内初始化。但是,不能不初始化。在声明时初始化之后则无法再次修改其值,不管是在构造函数内还是普通成员函数内。若在类内声明,并未初始化其值,则只能在构造函数的初始化列表里面初始化其值,不能在构造函数体内初始化,也无法在普通成员函数内初始化。

#include <iostream>

class Myclass{
public:
    Myclass()
        :a(4)
    {
        std::cout << "Constructor" << std::endl;
    }
private:
    const int a;
};

int main(void)
{
    Myclass a[3],*p[2];
    return 0;
}

3、常成员函数与常数据成员:类的常成员函数可以操作常数据成员,但是不能修改。普通成员函数可以操作常数据成员,但不能修改,总之,就是常数据成员无法在函数中修改值,也就是只读Read-Only。

class Myclass{
public:
    Myclass(){value = 0;};//构造函数
    void SetValue(int i){value = i;}//设置value值
private:
    int value;
};

int main(void)
{
    Myclass *p,my;//定义了一个Myclass对象指针p和一个对象my。
    p = &my;//将p指向对象my。
    return 0;
}

4、数据成员为指针的情况:

class Myclass{
public:
    Myclass(){}
    Myclass(int i){value = new int(i);}
private:
    int* value;
};

若要对value赋值,则可以利用构造函数Myclass(int i),在使用时:

Myclass my(10);

5、拷贝初始化构造函数:若没有自定义,则C++会自动创建拷贝初始化构造函数。

class Myclass{
public:
    Myclass(){}
    Myclass(int i){value = new int(i);}
private:
    int* value;
};

int main(void)
{
    Myclass my(10);
    Myclass my2 = my;//默认的拷贝初始化构造my2.等同于Myclass my2(my);
    return 0;
}

6、const int* x 和 int* const x 的区别:

int main(void)
{
    int i = 3;
    const int* x = &i;
    *x = 4;//不正确,无法将const修饰的int*对象改变值
    return 0;
}

要清楚认识到这个const修饰的是int* x,也就是说这个指针指向的对象的值是不能被修改的。那么可以更改这个指针的指向么?
答案是可以,参见如下代码。因为const只作用于*x,即x所指向的那个对象。

int main(void)
{
    int i = 3;
    int j = 5;
    const int* x = &i;
    x = &j; //答案是可以,指针的指向可以被改变
    return 0;
}

那下一个int* const x 呢?
从这几方面入手:可以修改x的指向么?可以修改x所指向的对象的值么?可以让x指向非const么?

int main(void)
{
    int i = 3;
    int j = 5;
    int* const x = &i;//x可以指向非const。
    x = &j;     //错误,不能修改x的指向。
    *x = 5;     //正确,只要x不是指向const对象,那么就可以改变它指向的对象的值,现在指向的是i,那么i的值变为了5.
    return 0;
}

总结说:就是看const修饰的是什么!对于const 类型名* 指针名;这样的表达式是同样的道理。
(1)若修饰的是int *x则表明不是修饰的指针本身,而是修饰的指针指向的对象,结果是指针可以改变指向,但指针指向的对象的值无法被改变。
(2)若修饰的是x,则表明指针的指向不能被改变(是Read-Only的),但指针指向的对象的值能否被改变还要看指向的对象自身是不是const的,如果是,则不能被修改,如果不是,则可以被修改。

7、对于new运算符创建对象和对象数组问题:

#include <iostream>
class MyClass{
public:
    MyClass(){std::cout << "MyClass Constructor." << std::endl;}
};

int main(void)
{
    MyClass* p = new MyClass;    //会调用一次构造函数。
    MyClass* q = new MyClass[10];  //会调用十次构造函数。
    return 0;
}

8、关于C++中的宏替换:(这是很大一块儿内容需要补充学习的)
定义的宏函数是如何替换的?(C语言的遗留问题。)
看到有这样的宏替换写法,和模板类似,但是目前编译不通过,估计是已经被废弃了吧?

#include <iostream>

#define MY_CLASS(classname,classdatatype)
class classname{
public:
    classname(classdatatype i = 0){value = i;}
private:
    classdatatype value;
};
MY_CLASS(MyClass,int);
MY_CLASS(OtherClass,double);
int main(void)
{
    MyClass my(3);
    OtherClass my2(2.0);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值