c/c++

c++基础-对象大小和友元类

2019-02-17  本文已影响1人  Peakmain

可变的参数:三个...表示

用可变的参数进行求和

#include<stdarg.h>
using namespace std;
int sum(int count...){
    va_list ap;
    //可变参数开始方法,count代表可以从哪里开始
    va_start(ap, count);//count以后都是可变的参数
    int sum = 0;
    for (int i = 0; i < count; i++)
    {
        sum += va_arg(ap, int);
    }
    //结尾
    va_end(ap);
    return sum;
    
}
void main(){
    int count=sum(2, 3, 5,4);//结果是8
    cout << count << endl;
    getchar();
}

static关键字

class Student
{
private:
    char *name;
    int age;
public:
    //静态属性在c++中必须初始化
    static int tag;

public:
    static void change(){
        tag += 12;
    }
};
//静态属性在c++中必须初始化,而初始化必须这么写
int Student::tag = 12;
void main(){
    Student stu;
    //Student::tag = 14;//重新赋值
    stu.change();
    cout << stu.tag << endl;
    getchar();
}

对象的大小

class A{
public:
    double b;
    int a;
    char c;
    static double d;
    //this指针
    A(int a){
        this->a = a;
    }

public:
    int getA(){
        return this->a;
    }
};
void main(){
    cout << "对象A的大小是:" << sizeof(A) << endl;
    A a1(12);
    cout << "类A中的a1的值:" << a1.getA() << endl;
    A a2(24);
    cout << "类A中的a2的值:" << a2.getA() << endl;
    getchar();
}

this的指针,代表当前的对象,因为类的方法存放在代码区,而代码区是共享的,所以要用this对其进行区分

const修饰函数

class Student
{
private:
    char *name;
    int age;

public:
    void change()const{//const放在()之后主要用来限制this关键字,
         //age += 12;
    }
      const void change(){//const放在()之前无影响,无需关注
         age += 12;
    }
};

void main(){
    Student stu;
    stu.change();
    getchar();
}

const Student *const this
第一个const 常量指针,代表值不可以修改
第二个const指针常量,代表指针的地址不能修改

友元函数

在类的内部才能访问私有函数,如果该方法声明成友元函数那么是可以在外部访问私有属性

class Person{

private:
    int age;
public:
    Person(int age){
        this->age = age;
    }
    int getAge(){
        return this->age;
    }
    //友元函数的声明
    friend void Person_test(Person *person, int age);
};
//友元函数的实现
void Person_test(Person *person,int age){
    person->age = age;
}
void main(){
    Person person=Person(2);
    Person_test(&person, 24);
    cout << person.getAge() << endl;
    getchar();
}

友元类

class A{
public ://B是A的友元类
    friend class B;
private:
    int age;
};
class B{
public:
    A a;
    void changeA(int newAge){
        a.age = newAge;
    }
    int  getA(){
        return a.age;
    }
};

void main(){
    B b;
    b.changeA(27);
    cout << "a的age是:" << b.getA() << endl;
    getchar();
}

案例

我们都知道真正的开发过程中我们的 cpp 或者 c 文件,最终 都是以dll 或者 so 库供调用者使用,所以为了确保类能够正常被调用,我们一般需要定义 .h 头文件,这时候我们可以对以上代码进行修改,首先定义一个Student.h文件

#ifndef STUDENT_H
#define STUDENT_H
class Student{
private://私有
    char *name;
    int age;
public:
    //静态属性的声明
    static int tag;

public:
    Student();
    Student(char*name);
    Student(char*name, int age);
    //析构函数:动态申请的时候需要释放内存
    ~Student();
    //拷贝函数
    Student(const Student &stu);
public:
    void setAge(int age);
    void setName(char*name);

    int getAge();
    char* getName();

    void print()const;
    //静态和友元函数
    static void changeTag(int tag);
    friend  void changeAge(Student *student,int age);
};
#endif;//STUDENT_H

Student.cpp文件

#include<iostream>
#include "Student.h"

//静态属性初始化
int Student::tag = 0;
//构造函数
Student::Student(char*name):age(0){//age赋默认值
    this->name = name;
}
Student::Student(char*name,int age) {
    this->name = name;
    this->age = age;
}
//析构函数:动态申请的时候需要释放内存
Student::~Student(){

};
//拷贝构造函数
Student::Student(const Student &stu){

};
//普通方法
void Student::setName(char*name){
    this->name = name;
}
void Student::setAge(int age){
    this->age = age;
}
int Student::getAge(){
    return age;
}
char* Student::getName(){
    return this->name;
}
void Student::print()const{
    std::cout << this->name << "的年龄是:" << this ->age<<std::endl;
}

//静态和友元函数
 void Student::changeTag(int tag1){
     tag = tag1;
};
//实现友元方法,不需要添加Student::#
 void changeAge(Student *student, int age){
     student->age = age;
};

main函数中调用

void main(){
    Student *stu=new Student("Peakmain",25);
    Student::changeTag(24);
    changeAge(stu,28);
    stu->print();
    getchar();
}
上一篇下一篇

猜你喜欢

热点阅读