C++的一些注意事项
2016-02-24 18:12
447 查看
1、类的构造:假定MyClass是一个自定义类,则当执行 MyClass a[3],*p[2]; 实际上执行构造函数的次数只有3次,也就是对象指针数组不会引起执行构造函数。
2、常数据成员:对于常数据成员,可以在声明时一并初始化(c++11),也可以在构造函数内初始化。但是,不能不初始化。在声明时初始化之后则无法再次修改其值,不管是在构造函数内还是普通成员函数内。若在类内声明,并未初始化其值,则只能在构造函数的初始化列表里面初始化其值,不能在构造函数体内初始化,也无法在普通成员函数内初始化。
3、常成员函数与常数据成员:类的常成员函数可以操作常数据成员,但是不能修改。普通成员函数可以操作常数据成员,但不能修改,总之,就是常数据成员无法在函数中修改值,也就是只读Read-Only。
4、数据成员为指针的情况:
若要对value赋值,则可以利用构造函数Myclass(int i),在使用时:
5、拷贝初始化构造函数:若没有自定义,则C++会自动创建拷贝初始化构造函数。
6、const int* x 和 int* const x 的区别:
要清楚认识到这个const修饰的是int* x,也就是说这个指针指向的对象的值是不能被修改的。那么可以更改这个指针的指向么?
答案是可以,参见如下代码。因为const只作用于*x,即x所指向的那个对象。
那下一个int* const x 呢?
从这几方面入手:可以修改x的指向么?可以修改x所指向的对象的值么?可以让x指向非const么?
总结说:就是看const修饰的是什么!对于const 类型名* 指针名;这样的表达式是同样的道理。
(1)若修饰的是int *x则表明不是修饰的指针本身,而是修饰的指针指向的对象,结果是指针可以改变指向,但指针指向的对象的值无法被改变。
(2)若修饰的是x,则表明指针的指向不能被改变(是Read-Only的),但指针指向的对象的值能否被改变还要看指向的对象自身是不是const的,如果是,则不能被修改,如果不是,则可以被修改。
7、对于new运算符创建对象和对象数组问题:
8、关于C++中的宏替换:(这是很大一块儿内容需要补充学习的)
定义的宏函数是如何替换的?(C语言的遗留问题。)
看到有这样的宏替换写法,和模板类似,但是目前编译不通过,估计是已经被废弃了吧?
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++实现JNI接口需要注意的事项
- 如何组织构建多文件 C 语言程序(二)
- 关于指针的一些事情
- 如何写好 C main 函数
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua和C语言的交互详解
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解