搞过几年纯C,对于面向过程的编程思想有了一定掌握。对于常年征战面向对象的人来说,从java转python学习成本并不高,面向对象的思想具有通用性。而对于从纯C工程师而言,转型往往具备一定难度。以最近的工作为契机,接触到了C++方面的知识,随手记录下。
一、C++中 :: 符的使用
C语言中不同功能的C文件之间,其函数体往往需要加入前缀来区分,例如读取IIC操作,IIC_Read();读取串口,UART_Read()。在C++中为了避免不同的类成员命名重复,使用符号 ::来表示作用域和从属划分。::符前面一般是类名,后面是类的对象名。也有命名空间::类名::对象名的表述。
二、类实例化时带括号与不带括号的区别
(5条消息) c++实例化类加括号和不加括号的区别_a25179824的博客-优快云博客
建议养成带括号的习惯。
三、类中成员如果没标识,默认是公有/保护/私有?
默认是私有的。构造函数一般都是puiblic,方便随时随地创建对象。
四、C++中的static
static修饰的静态属性分配在数据段,在程序执行之初就已创建,而非在类实例化时创建。private修饰的static属性变量无法在类外赋值。
五、私有变量如何访问
示例代码如下,声明cat类,类中定义了两个方法分别获取和设置猫毛发的颜色。
#include <iostream>
using namespace std;
class Cat
{
public:
string GetCatHairColor(void); // 声明
void SetCatHairColor(string color);
private:
string HairColor;
};
string Cat::GetCatHairColor(void)
{
return HairColor; // 可以外部定义,使用私有成员
}
void Cat::SetCatHairColor(string color)
{
HairColor = color;
}
int main()
{
// 小的测试程序不必使用new实例化,大的程序需要使用new,否则栈会撑爆
Cat cat; // 在栈区进行类的实例化
string s1;
cat.SetCatHairColor("write");
s1 = cat.GetCatHairColor();
cout << s1 << endl;
//cout << s1.HairColor << endl; // 私有成员不可直接访问
return 0;
}
write
六、类的函数方法应在哪里实现
一般比较简单的函数可以在函数体内实现,但建议统一放到体外实现,这样更整齐划一,一般函数体内实现的都是比较简单的,对私有成员的初始化很多都放到类内实现。
#include <iostream>
using namespace std;
class Cat
{
public:
Cat(string catname):CatName(catname) {}; // 初始化私有成员CatName,推荐这种初始化方式,不必写繁杂的函数体,十分简洁。
friend string getCatname(Cat pstu);
private:
string CatName;
};
// 友元函数在类外可以不加域直接访问,但要声明私有成员是在哪个类中,所以需要形参传参
string getCatname(Cat pstu)
{
return pstu.CatName;
}
int main()
{
Cat Wangzai("wangzai"); // 类定义并初始化
cout << getCatname(Wangzai) << endl;
return 0;
}
wangzai
七、引用符&
C++中的引用即别名,本身不占用地址空间。是C++中一种简化指针的用法。
int a;
int&ra=a; //定义引用ra,它是变量a的引用,即别名
说明:
(1)&在此不是求地址运算,而是起标识作用。
(2)声明引用时,必须同时对其进行初始化。
(3)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
ra=1; 等价于 a=1;
(4)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。
(5)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。