最近工作量不大,所以抽空来学习C++,听很多人说C++不难,但学习三年C++尚且晕乎乎也是正常的,鉴于此,我打算把我学习的东西贴出来,因为学会一个东西最好的方法就是把这个东西教给别人,可能我学习的过程中有很多的问题,所写的或有不正确的地方,都希望各位程序爱好者能够一一指正。
刚开始学习C++的类,开始的时候遇到一个小问题,可能是急于求成的原因吧:因为C++的标准化后,很多C的头文件在C++中用起来已不是那么方便了,比如说C中的StrCpy函数在C中是引入头文件#include<string.h>的,而在C++中是引入#include<string>的,因为.h文件都是C的,当然C++为了兼容C也可以引入#include<string.h>,而且在C++中,StrCpy函数用strcpy_s代替。
C++类的语法结构和Objective-C类似,都可包含头文件和实现文件,而在C++中类方法的实现可以和定义一起,即可以在定义的同时实现,而Objective-C不可以。总得来说C++的灵活性很大,所以应该很难学,因此稍安勿躁得好。
这里我把C++和Objective及C#对比,是因为我学过了OBC和C#,希望OBC和C#的基础能给学习C++带点帮助。
类的定义(姑且这以说,因为没仔细C++的专业术语,仿照OBC和C#的吧),和结构体类似,应该是和OBC里类的定义是差不多的:
class ClassName { public : 公有成员 公有方法 private: 私有成员 私有方法 };//和结构体一样,分号不能少
例如我定义的Person类,包含两个公有方法和两个私有变量,这里是和OBC一样在头文件里定义的。(Test.h)
class Person { public: void ChangeName(char *lname); void ChangeSex(int lsex); private: char name[20]; int sex; };
然后在实现文件里(Test.cpp文件)实现的,当然需要引入头文件(Test.h)
void Person::ChangeName(char *lname) { strcpy_s(name,lname); } void Person::ChangeSex(int lsex) { sex = lsex; }
C++可以在类定义的时候实现方法
class Person { public: Person(char *_name,int _sex) { strcpy_s(name,_name); sex = _sex; } private: char name[20]; int sex; }; Person() { cout<<"Call Release"<<endl; } void ChangeName(char *lname) { strcpy_s(name,lname); } void ChangeSex(int lsex) { sex = lsex; }
在OBC中的实例化类的方法是用 Test test = [[Test alloc]init] 这种方式来实例化的,在C++中用的是构造方法来创建实例初始化的,构造方法没有返回值,而且一个类中可以有多个构造函数(和OBC中Init方法有多个一样)。构造函数的函数名和类名一致。如之前定义的Person类的构造函数Person(char *_name,int _sex)带两个参数。
Person(char *_name,int _sex);
在OBC中有alloc就必须有Release,在C++也一样,与构造函数对应的析构函数(其实和OBC中很类似了)析构函数也没有返回值,但它也没有任何参数,如~Person();,析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后”
的工作。
类的实例化
Person p = Person("zheng",1);
下面就是头文件和实现文件
Test.h
#include <iostream> using namespace std; class Person { public: Person(char *_name,int _sex); ~Person(); void ChangeName(char *lname); void ChangeSex(int lsex); void Print() { cout<<"name:"<<name<<endl<<"sex:"<<sex<<endl; } private: char name[20]; int sex; };
Test.cpp
#include <iostream> #include <string> #include "Test.h" using namespace std; Person::Person(char *_name,int _sex) { strcpy_s(name,_name); sex = _sex; } Person::~Person() { cout<<"Call Release"<<endl; } void Person::ChangeName(char *lname) { strcpy_s(name,lname); } void Person::ChangeSex(int lsex) { sex = lsex; } void main() { char n[] = "liu"; int s = 1; Person p = Person("zheng",1); p.ChangeName(n); p.ChangeSex(s); p.Print(); system("pause"); }