您的位置:首页 > 编程语言 > C语言/C++

C++的一些注意事项

2016-02-24 18:12 447 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 c++