One possible answer is:

class Quaternion {
	private:
		double r, i, j, k;

	public:
		Quaternion( double re = 0.0, double im = 0.0, double jm = 0.0, double km = 0.0 );
		Quaternion( const Quaternion q );

		double abs();
		void conj();
		void negate();
		Quaternion add( const Quaternion q );
		Quaternion multiply( const Quaternion q );
		Quaternion sin();
		Quaternion cos();
		Quaternion tan();

		double real();
		Quaternion imag();

		bool is_real();
		bool is_imaginary();
};

A more experienced C++ programmer may use:

		Quaternion( const Quaternion & v );

		Quaternion add( const Quaternion & q ) const;
		Quaternion multiply( const Quaternion & q ) const;
		Quaternion sin() const;
		Quaternion cos() const;
		Quaternion tan() const;

		double real() const;
		Quaternion imag() const;

		bool is_real() const;
		bool is_imaginary() const;

The reference for the copy constructor is required in C++ for reasons which will be made known in class. The functions add, multiply, sin, cos, and tan all appear to return quaternions, and therefore it is unlikely that they will actually modify the object itself. The queries also should not modify the object.