C++编程习惯集锦

  1. 数据成员的访问权限务必设为private
  2. 对于成员函数若已知不会改变对象的数据成员,务必用const修饰(这样在将一个模块交付用户使用时可以避免出错)。例如:
T getValue()const{return instacne;}//若该函数没有const修饰,那么用户定义一个const对象来调用该函数编译就会报错,因为const对象只能调用const函数,但站在用户的角度来看,使用一个const对象调用一个不需要改变数据成员的函数本身并没有错,因此这里只能是接口设计者的错误了。接口设计者在确定成员函数不会改变数据成员后使用const修饰,const对象和非const对象都可以调用
  1. 对于函数之间的参数传递,务必传引用,并且在确保参数不需要改变的情况下,形参务必使用const修饰(相比于指针,引用传参的好处是传递者无需知道接收者是以引用的方式接收)
  2. 返回值的传递务必使用引用(被调函数的局部对象不能以引用返回)
  3. 对于自定义的头文件务必添加防卫式声明(防止重复编译)
#ifndef xxxx
#define xxxx
......
#endif
  1. 在类内定义的成员函数为内联函数,在类外定义的成员函数可以通过inline关键字声明为内联函数。(这两种形式都只是在建议编译器将函数做内联处理,具体含要看函数的复杂程度)(一般用户会尽量建议编译器使用inline,但是用户仅有建议权,编译器有决定权)
  2. 构造函数可以重载,但使用以下方式重载会报错.因为在创建无参对象时会出现歧义
MyClass(int a=0,int b=0):c(a),d(b){}
MyClass():c(0),d(0){}
  1. 构造函数在创建对象时务必使用初始化列表完成对象初始化,效率比在大括号中赋值效率高(一方面对象创建时会先执行初始化列表,再执行大括号里面的内容,另一方面若数据成员中有对象成员,使用初始化列表只需要调用构造函数,而进入大括号则可能调用构造函数和赋值构造函数)
  2. 在自定义拷贝赋值运算符时需要检测自我赋值的情况(不仅仅是效率的问题,若存在自我赋值,在步骤①delete时会将自身指针数据成员释放掉,此时自身的指针数据成员已经指向非法内存,再自身给自身赋值就会出错)
inline String& String::operator=(const String& str)
{
	if(this==&str){
		return *this;
	}
	delete[] m_data;//①这里先将自身指针数据成员所指向的内存释放掉
	m_data=new char[strlen(str.m_data)+1];//②指向新的内存
	strcpy(m_data,str.m_data);//③向新内存中填充内容
	return this;
}
  1. 对象数组的new要对应对象数组的delete,即
T obj=new T[int];
...
delete[] obj;

主要是针对对象中有数据成员有指针存在的情况,若不使用 delete[] 而仅使用delete ,那么只会调用一次析构函数(一般析构的是数组的首个对象),虽然对象数组所在的空间最终会被释放掉,但对象中指针数据成员申请的内存会泄露(其实若对象的数据成员没有指针,使用delete[]和使用delete效果一样,但一般为了表示严谨对象数组的析构都采用delete[])

  1. 结构体数据内存对齐:在创建结构体时,建议将结构体中的数据按从大到小定义,会节省内存。(对齐方式:按最大数据对齐)(但是按从大到小定义有时有不利于阅读,因此一般会在两者之间进行权衡)

未完待续。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值