c++
#param mark 数据类型 string代替char*
void TV::power() {
cout<<"power"<<endl;
string name = "FCF";
string hobby("eat");
cout<<name<<hobby<<endl;
string s1;
if (s1.empty()) {
cout<<"s1 empty"<<endl;
}
string s2("abc");
cout<<s2<<endl;
string s3(s2);//s2的副本
cout<<s3<<":"<<s3.size()<<endl;
string s4(3,'c');//
cout<<s4<<endl;
cout<<s3+s4<<endl;
if (s3!=s2) {
cout<<s3<<endl;
}else{
// string s5 = "f"+"c";这是错误的,要使用+,则必须有一个是string变量
string s5 = "f"+s4+"f";
cout<<s5<<endl;
cout<<s5[0]<<endl;
}
}
#param 类与对象
/**
* 内存分配
* 栈区:存储函数栈中的变量 int x=0,int *p = NULL;系统自动管理
* 堆区:new分配出的内存 int *p = new int;需要手动管理
* 全局区:存储全局变量和静态变量
* 常量区:存储常量
* 代码区:存储代码
*/
#.h
class Car
{
private:
int m_posX;
int m_posY;
public:
void init(){m_posX = 0;m_posY =0;};
/**
* 有且只有一次的初始化,根据条件初始化
*/
//构造函数实例化时被自动调用;构造函数与类名同名;构造函数没有返回值;构造函数可以进行重载;实例化对象时构造函数有且只用到一次;用户没有定义构造函数时,编译器自动生成构造函数
//构造函数可以有参和无参,不需要传参数的就是默认构造函数,一个类可以没有默认构造函数;所有构造函数如果都带有默认值,那么这个构造函数也是默认构造函数
Car(){};
Car(int x){m_posX = x;};
Car(int x,int y){m_posX = x;m_posY = y;};
// Car():m_posX(0),m_posY(1){};//初始化列表
};
class Teacher
{
private:
string m_name;
int m_age;
const int m_iMax;//这种成员变量必须在函数初始化列表中初始化//
public:
Teacher(string name = "fcf",int age = 1,int max = 100);//默认构造函数
Teacher(const Teacher&);//拷贝构造函数,只是一个引用而已。所以要想使用拷贝赋值传参,必须给参数另外复制
~Teacher();//析构函数,如果没有自定义,系统会产生一个析沟函数,析构函数在对象销毁时自动调用,如果在构造函数有申请堆内存,那么在析沟函数中要手动释放
void setName(string _name);
void setAge(int _age);
string getName();
int getAge();
};
#.m
Teacher::Teacher(string name,int age,int max):m_name(name),m_age(age),m_iMax(max){
cout<<"构造函数"<<endl;
}
Teacher::Teacher(const Teacher&te):m_name(te.m_name),m_age(te.m_age),m_iMax(te.m_iMax) {
cout<<"拷贝构造函数"<<endl;
}
Teacher::~Teacher(){
cout<<"析构函数"<<endl;
}
void Teacher::setName(string _name){
m_name = _name;
}
void Teacher::setAge(int _age){
m_age = _age;
}
string Teacher::getName(){
return m_name;
}
int Teacher::getAge(){
return m_age;
}
#.main
void test(Teacher t);
int main(int argc, const char * argv[]) {
Car car1;
Car car2(0);
Car car3(0, 1);
Teacher t1;
cout<<t1.getName()<<" "<<t1.getAge()<<endl;
Teacher t2 = t1;
cout<<t2.getName()<<" "<<t2.getAge()<<endl;
Teacher t3(t1);
cout<<t3.getName()<<" "<<t3.getAge()<<endl;
//我们看到Teacher的构造函数只打印了一次,但是三个对象也都实例化了。那么后两个调用的就是拷贝构造函数
test(t1);//这样参数传递也会调用拷贝构造函数
Teacher t5;
memcpy(&t5, &t1, sizeof(Teacher));//地址重新拷贝
cout<<t5.getName()<<" "<<t5.getAge()<<endl;
return 0;
}
void test(Teacher t){
}
注意:const类型和引用类型,在创建的时候,必须进行初始化,即在初始值列表进行初始化,切勿在构造函数体进行初始化。